Alamofire 的证书、表单数据和 HTTP Header 数据无效
Invalid Certificate, form data and HTTP Header data with Alamofire
我想使用 Alamofire 进行网络请求。服务器的证书无效,我有 header 个值和表单数据要发送。现在我已经尝试了很多 SO 问题,但到目前为止还没有运气。我得到的只是我需要正确设置管理器 object。
所以允许无效证书我这样做了:
let serverTrustPolicies: [String: ServerTrustPolicy] = ["abc.com:8080/services/v2/xyz": .DisableEvaluation]
let manager = Manager(serverTrustPolicyManager:ServerTrustPolicyManager(policies: serverTrustPolicies))
然后使用 Headers 我这样做了:
var defaultHeaders = Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders ?? [:]
defaultHeaders["X-Auth-Module"] = "true"
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.HTTPAdditionalHeaders = defaultHeaders
let manager = Alamofire.Manager(configuration: configuration)
为了合并上述 2 位经理,我这样做了:
let serverTrustPolicyManager:ServerTrustPolicyManager = ServerTrustPolicyManager(policies: serverTrustPolicies)
let manager = Alamofire.Manager(configuration: configuration, delegate: Alamofire.Manager.sharedInstance.session.delegate, serverTrustPolicyManager: serverTrustPolicyManager)
问题出在 'delegate',我无法在此处找到合适的委托。或者如果有任何其他简单的方法请建议。新手 Swift 开发
下面是这个问题的解决方案:
//set default headers
var defaultHeaders = Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders ?? [:]
//I required this key
defaultHeaders["X-Auth-Module"] = "1"
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.HTTPAdditionalHeaders = defaultHeaders
let serverTrustPolicies: [String: ServerTrustPolicy] = [
"10.10.10.1:8080": .DisableEvaluation
]
manager = Alamofire.Manager(
configuration: configuration,
serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies))
// Handling challange
manager!.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 = self.manager!.session.configuration.URLCredentialStorage?.defaultCredentialForProtectionSpace(challenge.protectionSpace)
if credential != nil {
disposition = .UseCredential
}
}
}
return (disposition, credential)
}
现在,在管理器准备就绪后,只需使用 manager 对象来创建请求。
manager!.request(.POST, (req?.url())!, parameters: req?.headerParams(), encoding: .URL, headers:nil)
.response(completionHandler: { req, res, data, error in
print("req:\(req), res:\(res),data:\(data),error:\(error)")
})
我想使用 Alamofire 进行网络请求。服务器的证书无效,我有 header 个值和表单数据要发送。现在我已经尝试了很多 SO 问题,但到目前为止还没有运气。我得到的只是我需要正确设置管理器 object。 所以允许无效证书我这样做了:
let serverTrustPolicies: [String: ServerTrustPolicy] = ["abc.com:8080/services/v2/xyz": .DisableEvaluation]
let manager = Manager(serverTrustPolicyManager:ServerTrustPolicyManager(policies: serverTrustPolicies))
然后使用 Headers 我这样做了:
var defaultHeaders = Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders ?? [:]
defaultHeaders["X-Auth-Module"] = "true"
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.HTTPAdditionalHeaders = defaultHeaders
let manager = Alamofire.Manager(configuration: configuration)
为了合并上述 2 位经理,我这样做了:
let serverTrustPolicyManager:ServerTrustPolicyManager = ServerTrustPolicyManager(policies: serverTrustPolicies)
let manager = Alamofire.Manager(configuration: configuration, delegate: Alamofire.Manager.sharedInstance.session.delegate, serverTrustPolicyManager: serverTrustPolicyManager)
问题出在 'delegate',我无法在此处找到合适的委托。或者如果有任何其他简单的方法请建议。新手 Swift 开发
下面是这个问题的解决方案:
//set default headers
var defaultHeaders = Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders ?? [:]
//I required this key
defaultHeaders["X-Auth-Module"] = "1"
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.HTTPAdditionalHeaders = defaultHeaders
let serverTrustPolicies: [String: ServerTrustPolicy] = [
"10.10.10.1:8080": .DisableEvaluation
]
manager = Alamofire.Manager(
configuration: configuration,
serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies))
// Handling challange
manager!.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 = self.manager!.session.configuration.URLCredentialStorage?.defaultCredentialForProtectionSpace(challenge.protectionSpace)
if credential != nil {
disposition = .UseCredential
}
}
}
return (disposition, credential)
}
现在,在管理器准备就绪后,只需使用 manager 对象来创建请求。
manager!.request(.POST, (req?.url())!, parameters: req?.headerParams(), encoding: .URL, headers:nil)
.response(completionHandler: { req, res, data, error in
print("req:\(req), res:\(res),data:\(data),error:\(error)")
})