iOS程序猿

Alamofire 5 token 刷新以及请求重试

2020-08-14  本文已影响0人  唯牧雪

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

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))
            }
        }
    }

}
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())
    }
}
      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/

上一篇 下一篇

猜你喜欢

热点阅读