说明
本文基于上一篇:Alamofire4.0的封装,实现请求失败后的重连策略,添加了自定义的校验过程.
适用场景
移动端与服务器的交互过程中,可能会出现数据返回成功,但是我们需要对个别特殊的错误代码进行请求参数修正并重新发起请求
关键代码
- 自定义校验
如下所示,. validate
自定义的校验闭包, 在Alamofire4.0加上了data
参数.
这样我们就可以在. validate
的回调内,对data
进行数据解析.
extension HTTPSessionManager {
public func request(methodType : HTTPMethod, urlString : String, parameters : [String: Any]?, successBlock : @escaping HTTPSuccessBlock, failureBlock : @escaping HTTPFailureBlock) {
manager.request(urlString, method: methodType, parameters: requestJson, encoding: JSONEncoding.default, headers: SessionManager.defaultHTTPHeaders)
.validate { request, response, data in
// 自定义的校验闭包, 现在加上了 `data` 参数(允许你提前转换数据以便在必要时挖掘到错误信息)
guard let data = data else {
return .failure(错误信息)
}
let retCode = 服务端返回代码
if retCode == 需要重连的特殊的错误代码 {
return .failure(错误信息) //打回重连
}
return .success //校验通过,不重连
}
.responseJSON { (json) in
// 返回数据处理
switch json.result {
case .success(let result):
let retCode = JSON(result)["retCode"].intValue
if retCode == 成功 {
successBlock(JSON(result))
} else {
guard let errorCode = HTTPErrorCode(rawValue: retCode) else {
return failureBlock(HTTPErrorCode.UnknownError)
}
return failureBlock(errorCode)
}
case .failure(let error):
failureBlock(HTTPErrorCode.UnknownError)
}
}
}
}
- 修改请求参数
Request
的参数需要到OAuth2Handler
的RequestAdapter
回调中修改
func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
var urlRequest = urlRequest
// 重置请求参数
if 判断此请求是否要修改参数 {
var body = try! JSONSerialization.jsonObject(with: urlRequest.httpBody!, options:.mutableContainers) as! [String : Any]
let httpBody = 新的请求参数
urlRequest.httpBody = try! JSONSerialization.data(withJSONObject: httpBody, options: .prettyPrinted)
}
return urlRequest
}