Alamofire 5实现SSL固定时调用AFsession.request报错:method参数多余
解决Alamofire 5自定义Session中请求参数不匹配的问题
嘿,我来帮你搞定这个问题!你遇到的报错根源很明确:你自定义的AFsession.request(_:)方法只接受URLRequestConvertible类型的单个参数,但调用时你用了和原生AF.request一样的多参数写法(URL、method、parameters这些),编译器找不到对应的重载方法,所以才会提示method: .post是多余参数。
下面给你两种简单的解决方案,选哪种都能解决问题:
方案1:给自定义AFsession添加和原生匹配的请求方法
直接给你的AFsession类加一个和原生Alamofire完全一致的request重载方法,这样你原来的调用代码完全不用改,直接就能用:
final class AFsession { let evaluators = [ "mydomain.com": PinnedCertificatesTrustEvaluator(certificates: [ Certificates.stackExchange ]) ] let session: Session private init() { session = Session( serverTrustManager: ServerTrustManager(evaluators: evaluators) ) } private static let shared = AFsession() // 原有的单参数方法 static func request(_ convertible: URLRequestConvertible) -> DataRequest { return shared.session.request(convertible) } // 新增:和原生Alamofire匹配的重载方法 static func request( _ url: URLConvertible, method: HTTPMethod = .get, parameters: Parameters? = nil, encoding: ParameterEncoding = URLEncoding.default, headers: HTTPHeaders? = nil, interceptor: RequestInterceptor? = nil, requestModifier: RequestModifier? = nil ) -> DataRequest { return shared.session.request( url, method: method, parameters: parameters, encoding: encoding, headers: headers, interceptor: interceptor, requestModifier: requestModifier ) } }
修改完之后,你原来的调用代码直接换成AFsession.request就能正常编译运行了:
AFsession.request(URL, method: .post, parameters: [:], encoding: body, headers: header) .responseString { response in guard response.result.error == nil else { print("error calling POST on \(URL)") print(response.result.error!) return } // 处理成功响应 }
方案2:手动构造URLRequest后传入
如果你不想添加重载方法,也可以先把请求参数转换成URLRequestConvertible类型,再传给自定义的AFsession.request:
do { // 先构造基础请求 var urlRequest = URLRequest(url: URL) urlRequest.method = .post urlRequest.headers = header // 对参数进行编码 let encodedRequest = try body.encode(urlRequest, with: [:]) // 调用自定义session AFsession.request(encodedRequest) .responseString { response in guard response.result.error == nil else { print("error calling POST on \(URL)") print(response.result.error!) return } // 处理成功响应 } } catch { print("请求编码失败:\(error)") }
这里用do-catch处理了编码可能出现的错误,比直接用try!更安全,适合实际项目使用。
额外小提示:确保SSL固定生效
最后再帮你检查下SSL固定的代码,确保它能正常工作:
- 确认你的
mycert.cer证书文件已经正确添加到项目里,并且在Target Membership中勾选了对应的target; - 如果需要更严格的证书验证(比如验证整个证书链),可以修改
PinnedCertificatesTrustEvaluator的初始化参数:
let evaluators = [ "mydomain.com": PinnedCertificatesTrustEvaluator( certificates: [ Certificates.stackExchange ], validateCertificateChain: true, // 开启证书链验证 validateHost: true // 开启主机名验证 ) ]
这样调整后,你的自定义Session既能实现SSL固定,又能和原生Alamofire的调用方式保持一致,完美解决参数不匹配的问题!
内容的提问来源于stack exchange,提问作者Sandeep Nair
相关产品推荐
相关产品推荐

