【问题标题】:Correct Alamofire retry for JWT if status 401?如果状态为 401,请更正 JWT 的 Alamofire 重试?
【发布时间】:2022-12-18 08:36:44
【问题描述】:

我正在尝试重试我的 Alamofire 拦截器,因为我使用的是 JSON Web 令牌。适应效果很好。但服务器在用户注册或授权后每 10 分钟更新一次访问令牌。 10 分钟后,访问令牌不再起作用,服务器响应为 401。所以我需要在状态为 401 时刷新令牌。正如我上面提到的,适应效果很好。但我需要帮助了解如何处理重试。下面是我的拦截器:

class RequestInterceptor: Alamofire.RequestInterceptor {

    func adapt( _ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) {
    var urlRequest = urlRequest
            urlRequest.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
            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 {
            completion(.doNotRetryWithError(error))
            return
        }
    }

}

我的视图模型:

func refreshTokenFunc() {
        
        AF.request(TabBarModel.Request.refreshTokenUrl, method: .post, parameters: parameters, encoder: JSONParameterEncoder.default, interceptor: RequestInterceptor()).response { response in
...

和用法(我使用 SwiftUI):

.task {
            tabBarViewModel.refreshTokenFunc()
        }

我正在尝试使用互联网上的一些示例。但这对我不起作用。

【问题讨论】:

  • 你可以用refreshToken代替completion(.doNotRetryWithError(error)),并在完成时调用retry()完成再次调用?
  • 谢谢@Larme,但它不起作用,因为我把它放在那里时看不到印刷品:(

标签: swift jwt token alamofire interceptor


【解决方案1】:

在你retry中,你需要在guard的两边调用completion处理程序,而不仅仅是在else一边。 completion(.retry) 很常见,但您也可以跟踪延迟以确保您不会使后端超载。

此外,您应该验证响应并检查错误,而不是直接进入request.task

AF.request(...).validate()... // Ensure the response code is within range.

// In retry

guard let error = error.asAFError, error.responseCode == 401 else { ... }

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 2018-12-15
    相关资源
    最近更新 更多