美文网首页iOS程序猿
Alamofire 5 token 刷新以及请求重试

Alamofire 5 token 刷新以及请求重试

作者: 唯牧雪 | 来源:发表于2020-08-14 18:05 被阅读0次

Alamofire是可用于iOS和Mac项目的流行框架。
这里来讲一下如何使用Alamofire实现token的签名和在token过期刷新token后进行网络请求的重试。

  • 创建RequestAdapter和RequestRetrier
final class RequestInterceptor: Alamofire.RequestInterceptor {

    func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) {
        guard urlRequest.url?.absoluteString.hasPrefix(BaseURL) == true else {
            /// 如果这个请求不需要签名则直接进行请求
            return completion(.success(urlRequest))
        }
        var urlRequest = urlRequest

        /// 使用access token来进行签名
        urlRequest.setValue(你缓存的token, forHTTPHeaderField: "Authorization")

        urlRequest.setValue("在这里加一些服务器需要收集的设备信息的键值对", forHTTPHeaderField: "User-Agent")
        urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")

        completion(.success(urlRequest))
    }
    
    func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) {
        guard let response = request.task?.response as? HTTPURLResponse, response.statusCode == 401 else {
            /// 这个请求没有因为401token过期
            /// 则进行原始请求,不重试
            return completion(.doNotRetryWithError(error))
        }
        /// 401token过期,则调用刷新请求的方法
        HpptClient.share.refreshToken { (complete) in
            if complete {
                /// 刷新token成功后过1秒进行重试请求
                completion(.retryWithDelay(1))
            } else {
                /// 刷新token失败放弃重试
                return completion(.doNotRetryWithError(error))
            }
        }
    }

}
  • 创建自定义Session
class SessionManager: NSObject {
    static let share: SessionManager = SessionManager()

    var sessionManager: Session!
    fileprivate let configuration = URLSessionConfiguration.default

    override init() {
        super.init()
        configSession()
    }

    final func configSession() {
        configuration.timeoutIntervalForRequest = 15    // 15s超时
        sessionManager = Session(configuration: configuration, interceptor: RequestInterceptor())
    }
}
  • 使用配置好的Session进行网络请求
      LDSessionManager.share.sessionManager.request("请求地址", method: 方法类型, parameters:  请求参数, encoding: JSONEncoding.default)
            .validate(statusCode: 200..<300)
            .validate(contentType: ["application/json"])
            .responseData { response in
                switch response.result {
                case let .success(value):
                    let dataJson = JSON(value)
                    printD("response = \(dataJson)")
                case let .failure(error):
                    printD(error)
                }
        }

参考文献:
https://www.avanderlee.com/swift/authentication-alamofire-request-adapter/

相关文章

网友评论

    本文标题:Alamofire 5 token 刷新以及请求重试

    本文链接:https://www.haomeiwen.com/subject/uiegdktx.html