修改有效负载的 Alamofire 重试请求

Alamofire retry request with modified payload

我一直在考虑在遇到某个 400 错误时使用 alamofire 重试请求,到目前为止重试有效,但是我不确定是否可以修改请求对象以便在重试时重试有一个更新的有效负载。

欢迎提供阅读 material 的任何建议和链接。

这是我的代码:

class HTTP412Retrier: RequestRetrier, RequestAdapter {

  func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
    print("called") // this is not being printed 
    return urlRequest
  }


  func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) {
    if let response = request.task?.response as? HTTPURLResponse, response.statusCode == 412 {
      completion(request.retryCount < 3, 0.0)
    } else {
      completion(false, 0.0)
    }
  }
}

文档讨论 adapting and retrying requests 所以我想这就是您要找的。

我写了以下内容,它按预期命中了 adapt(_:) 函数

import UIKit
import Alamofire

class ViewController: UIViewController {

    let sessionManager = Alamofire.SessionManager(configuration: URLSessionConfiguration.default)

    override func viewDidLoad() {
        super.viewDidLoad()

        sessionManager.adapter = AccessTokenAdapter(accessToken: "1234")
        sessionManager.request("http://example.com")
    }

}

class AccessTokenAdapter: RequestAdapter {

    private let accessToken: String

    init(accessToken: String) {
        self.accessToken = accessToken
    }

    func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
        var urlRequest = urlRequest
        guard let urlString = urlRequest.url?.absoluteString, urlString.hasPrefix("https://example.com") else { return urlRequest }
        urlRequest.setValue("Bearer " + accessToken, forHTTPHeaderField: "Authorization")
        return urlRequest
    }

}