在最近的开发中,遇到网络请求中会验证token是否超时的需求,如果超时需要自动获取新的token,然后在完成网络请求. OC中有 NSURLProtocol 进行网络请求拦截,而swift 的 Alamofire框架中 RequestAdapter与RequestRetrier可以完美的解决这个问题,下面上代码:
class OAuthHandler:RequestAdapter,RequestRetrier {
func adapt(_ urlRequest:URLRequest)throws ->URLRequest {
var urlRequest = urlRequest
//这里写更新网络请求中的token 的代码
return urlRequest
}
public func should(_ manager:SessionManager, retry request:Request, with error:Error, completion:@escaping RequestRetryCompletion) {
//401,权限验证失败
if let response = request.task?.responseas?HTTPURLResponse, response.statusCode ==401 {
//do something 获取新token
completion(true,0.0)//获取新token后重试请求 0秒后重试
}
} else {
completion(false,0.0)// 不重连
}
}
}
网络请求的代码:
let sessionManager = SessionManager()
sessionManager.adapter =OAuthHandler()
sessionManager.retrier =OAuthHandler()
sessionManager.request(urlString, method:HTTPMethod.post,parameters: parameters, encoding: JSONEncoding.default, headers:headers).validate().responseJSON { response in
// do something
}
使用对象方法实现网络请求,而不是类方法,这样就可以自动更新token,不会影响用户操作