alamofire在SessionManager中更新JWT头

时间:2018-01-09 14:38:32

标签: ios swift alamofire

我有以下源代码。我有一个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的方式很直接,比如,来自viewcontroller,

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

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

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

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

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

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

如果有问题,我正在使用Alamofire 4.5和Swift 4.0。

1 个答案:

答案 0 :(得分:4)

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

相关源代码:

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