gpt4 book ai didi

ios - 如何使用 Alamofire 重试请求?

转载 作者:行者123 更新时间:2023-11-28 07:28:12 28 4
gpt4 key购买 nike

如果第一个请求的响应代码是 401,在 Alamofire 中有没有办法重新发送请求,我可以刷新 token 并再次重试我的请求?

问题是我已经在使用 MVVM 和完成处理程序。在我的 ViewModel 中,请求函数如下所示:

public func getProfile(completion: @escaping (User?) -> Void) {
guard let token = UserDefaults.standard.value(forKey: Constants.shared.tokenKey) else { return }

let headers = ["Authorization": "Bearer \(token)"]

URLCache.shared.removeAllCachedResponses()
Alamofire.request(Constants.shared.getProfile, method: .get, parameters: nil, encoding: URLEncoding.default, headers: headers).responseJSON { (response) in
switch response.result {
case .success:
guard let data = response.data else { return }

if JSON(data)["code"].intValue == 401 {
// here I need to refresh my token and re-send the request
} else {
let user = User(json: JSON(data)["data"])
completion(user)
}

completion(nil)
case .failure(let error):
print("Failure, ", error.localizedDescription)
completion(nil)
}
}
}

在我的 ViewController 中,我这样调用它:

viewModel.getProfile { (user) in
if let user = user {
...
}
}

所以我不知道如何在不使用新函数的情况下重试我的请求,所以我仍然可以从我的 ViewController 中的 completion 部分获得我的 user 响应。也许有人可以告诉我正确的道路。提前致谢!

最佳答案

要重试请求,请创建请求包装器并像这样使用 Alamofire 的 RequestInterceptor 协议(protocol)

final class RequestInterceptorWrapper: RequestInterceptor {

// Retry your request by providing the retryLimit. Used to break the flow if we get repeated 401 error
var retryLimit = 0

func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) {

guard let statusCode = request.response?.statusCode else { return }
switch statusCode {
case 200...299:
completion(.doNotRetry)
default:
if request.retryCount < retryLimit {
completion(.retry)
return
}
completion(.doNotRetry)
}
}

//This method is called on every API call, check if a request has to be modified optionally

func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) {
//Add any extra headers here
//urlRequest.addValue(value: "", forHTTPHeaderField: "")
completion(.success(urlRequest))
}
}

用法:对于每个 API 请求,都会调用 adapt() 方法,并在 validate() 上使用重试方法来验证状态码。可以通过在此处创建拦截器实例来设置 retryLimit如果响应出错,提供 retryLimit 将调用 API 两次

let interceptor = RequestInterceptorWrapper() 
func getDataFromAnyApi(completion: @escaping (User?) -> Void)) {
interceptor.retryLimit = 2
AF.request(router).validate().responseJSON { (response) in

guard let data = response.data else {
completion(nil)
return
}
// convert to User and return
completion(User)
}
}

关于ios - 如何使用 Alamofire 重试请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55795489/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com