【问题标题】:alamofire updating JWT header in SessionManageralamofire 在 SessionManager 中更新 JWT 标头
【发布时间】:2018-01-09 14:38:32
【问题描述】:

我有以下源代码。我有一个 AlamoFire SessionManager 和一个使用该 SessionManager 发出 HTTP 请求的 ViewController。

var Almgr : Alamofire.SessionManager = {
    // Create the server trust policies
    let serverTrustPolicies: [String: ServerTrustPolicy] = [
        "localhost": .disableEvaluation
    ]
    // Create custom manager
    let configuration = URLSessionConfiguration.default

    UserDefaults.standard.synchronize()
    var jwt = UserDefaults.standard.string(forKey: conf.JWT_KEY)

    var headers : HTTPHeaders = Alamofire.SessionManager.defaultHTTPHeaders

    let extraHeaders : HTTPHeaders = [
        "Authorization": "Bearer "+(jwt ?? ""),
        "Accept": "application/json"
    ]

    extraHeaders.forEach({ (k, v) in
        headers[k] = v
    })

    configuration.httpAdditionalHeaders = headers
    let man = Alamofire.SessionManager(
        configuration: configuration,
        serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
    )
    return man
}()

从上面的代码中,您可以看到,我正在阅读 UserDefaults.standard.string 以获取 JWT 令牌的值并在我发出的每个 HTTP 请求中发送它。

我使用这个 Almgr 的方式很简单,就像从视图控制器中一样,

Almgr.request("my-url", method: .get).validate().responseJSON { response in

然而问题是,Almgr 似乎只初始化了一次,即使我通过将 JWT 令牌设置为不同的值来更改它,通过, UserDefaults.standard.set(jwt, forKey: conf.JWT_KEY) 在 UserDefaults 中,它的值没有被获取。

在视图控制器中,我有以下代码:

print("Getting JWT in MyViewController", UserDefaults.standard.string(forKey: conf.JWT_KEY))
Almgr.request("my-url", method: .get).validate().responseJSON { response in

打印语句为 JWT 令牌打印一个不同(正确)的值,而不是使用启动应用程序时存在的旧 JWT 的 Almgr。

现在我的问题是,我怎样才能让 Almgr 在调用时总是懒惰地评估正确的 JWT 值。

如果重要的话,我正在使用 Alamofire 4.5 和 Swift 4.0。

【问题讨论】:

    标签: ios swift alamofire


    【解决方案1】:

    解决方案是使用请求适配器。

    相关源码:

    class AccessTokenAdapter: RequestAdapter {
        private let accessToken: String
    
        init(accessToken: String) {
            self.accessToken = accessToken
        }
    
        func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
            var urlRequest = urlRequest
    
            if let urlString = urlRequest.url?.absoluteString, urlString.hasPrefix("https://httpbin.org") {
                urlRequest.setValue("Bearer " + accessToken, forHTTPHeaderField: "Authorization")
            }
    
            return urlRequest
        }
    }
    
    
    let sessionManager = SessionManager()
    sessionManager.adapter = AccessTokenAdapter(accessToken: "1234")
    
    sessionManager.request("https://httpbin.org/get")
    

    文档链接:https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#adapting-and-retrying-requests

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 2018-06-26
      • 2018-10-16
      • 2021-02-06
      • 1970-01-01
      • 2015-09-05
      相关资源
      最近更新 更多