gpt4 book ai didi

ios - header 未定义 responseJSON Alamofire 2.0 和 Swift 2.0

转载 作者:行者123 更新时间:2023-11-29 01:35:19 25 4
gpt4 key购买 nike

使用 swift 2.0 Xcode 7 和 Alamofire 2.0,我想知道如何使用正确的 HTTPAdditionalHeaders 用法更新代码,在更新到 2.0 之前,这个管理器 session 配置工作得很好,但现在 API 给我一个错误REQUEST 由于未定义的 header 。¿我该如何解决?¿是否可以在 ApiClient 中维护 alamoFireManager session 配置 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()
}

}

主服务.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 header 附加到实际的 URL 请求。 Apple 从未支持您尝试修改 sharedInstance 配置 header 的方式。在 iOS 9 中,他们最终将行为与文档内联。在将配置应用于 URL session 后,他们会完全忽略在配置上设置的 header 。因此,您需要创建自己的自定义 URL session 配置并在创建 URL session 之前设置自定义 header ,或者在 Authorization header 的情况下,您需要将其直接附加到请求中本身。

在您的路由器中,您应该在获取列表之前将 Authorization header 附加到您的 mutableURLRequest。这将解决您的问题。您必须弄清楚如何重构您的逻辑以使 Router 可以访问 oAuthToken。我会考虑将其设为 static var oAuthToken,这样您就可以使用 APIClient.oAuthToken 轻松访问该值。

关于ios - header 未定义 responseJSON Alamofire 2.0 和 Swift 2.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33026587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com