我有以下源代码。我有一个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。
答案 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")