[英]headers undefined responseJSON Alamofire 2.0 and Swift 2.0
使用swift 2.0 Xcode 7和Alamofire 2.0,我想知道如何使用正確的HTTPAdditionalHeaders用法更新代碼,在更新到2.0之前,此管理器會話配置運行良好,但是由於以下原因,API給了我一個BAD REQUEST:未定義的標頭。 ¿我該如何解決? ¿能否在ApiClient中維護alamoFireManager會話配置HTTPAdditionalHeaders?
ApiClient.swift
class ApiClient {
// User token
var oAuthToken = "R0Fh65G4MjCcD18OsiTcPIfHxohFIzFhapuWNFSBhX2conQ1e+3vlv0XrJQVcw7fRg=="
var mainService: MainService
init() {
let alamoFireManager = Manager.sharedInstance
alamoFireManager.session.configuration.HTTPAdditionalHeaders = [
"Authorization": "Bearer \(oAuthToken)"
]
// override the default challenge behavior in Alamofire using the SessionDelegate override closures.
//an example of how you can allow Alamofire to accept invalid certificates:
alamoFireManager.delegate.sessionDidReceiveChallenge = { session, challenge in
var disposition: NSURLSessionAuthChallengeDisposition = .PerformDefaultHandling
var credential: NSURLCredential?
if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
disposition = NSURLSessionAuthChallengeDisposition.UseCredential
credential = NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!)
} else {
if challenge.previousFailureCount > 0 {
disposition = .CancelAuthenticationChallenge
} else {
credential = alamoFireManager.session.configuration.URLCredentialStorage?.defaultCredentialForProtectionSpace(challenge.protectionSpace)
if credential != nil {
disposition = .UseCredential
}
}
}
return (disposition, credential)
}
mainService = MainService()
}
}
MainService.swift
struct MainService {
enum Router: URLRequestConvertible {
static let baseURLString = "https://api.test.com/v1"
case GetList([String: AnyObject])
case GetById(String)
var method: Alamofire.Method {
switch self {
case .GetList:
return .GET
case .GetById:
return .GET
case .Add:
return .POST
case .Update:
return .PUT
case .Delete:
return .DELETE
}
}
var path: String {
switch self {
case .GetList:
return "/flyers"
case .GetById(let id):
return "/flyers/\(id)"
case .Add:
return "/flyers"
case .Update(let id, _):
return "/flyers/\(id)"
case .Delete(let id):
return "/flyers/\(id)"
}
}
var URLRequest: NSMutableURLRequest {
let URL = NSURL(string: Router.baseURLString)!
let mutableURLRequest = NSMutableURLRequest(URL: URL.URLByAppendingPathComponent(path))
mutableURLRequest.HTTPMethod = method.rawValue
switch self {
case .GetList(let parameters):
return Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: parameters).0
case .Add(let parameters):
return Alamofire.ParameterEncoding.JSON.encode(mutableURLRequest, parameters: parameters).0
case .Update(_, let parameters):
return Alamofire.ParameterEncoding.JSON.encode(mutableURLRequest, parameters: parameters).0
default:
return mutableURLRequest
}
}
}
func getList(completionHandler: ([Flyer]?, NSError?) -> ()) {
Alamofire.request(Router.GetList(["skip": Test().getSkip(), "total":Test().getTotal()])).responseJSON { (request, response, result) in
switch result {
case .Success(let data):
let json = JSON("Request success---------------------\(data)")
print(json)
case .Failure(_, let error):
print("Request failed with error: \(error)")
}
}
}
}
結果
Request success---------------------{
code = "BAD_REQUEST";
message = "Bad request";
status = 400;
}
您必須將Authorization
標頭附加到實際的URL請求。 Apple從未支持您嘗試修改sharedInstance
配置標頭的方式。 在iOS 9中,他們最終將行為與文檔內聯。 在將配置應用於URL會話后,它們將忽略配置中設置的忽略標頭。 因此,您需要創建自己的自定義URL會話配置並在創建URL會話之前設置自定義標頭,或者在出現Authorization
標頭的情況下,您需要將其直接附加到請求本身。
在路由器中,應該在獲取列表之前將Authorization
標頭附加到mutableURLRequest
。 這樣可以解決您的問題。 您將必須弄清楚如何重構邏輯以使oAuthToken
可被Router
訪問。 我會考慮將其static var oAuthToken
以便您可以使用APIClient.oAuthToken
輕松訪問該值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.