gpt4 book ai didi

ios - alamofire 在 SessionManager 中更新 JWT header

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

我有以下源代码。我有一个 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 token 的值并在我发出的每个 HTTP 请求中发送它。

我使用这个 Almgr 的方式很直接,比如从 View Controller ,

Almgr.request("my-url", method: .get).validate().responseJSON { 响应在

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

在 View Controller 中,我有以下代码:

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

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

现在我的问题是,如何让 Almgr 在被调用时始终延迟评估正确的 JWT 值。

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

最佳答案

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

相关源码:

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

关于ios - alamofire 在 SessionManager 中更新 JWT header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48170544/

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