【发布时间】:2019-09-24 02:34:34
【问题描述】:
我有一个关于在 swift 中使用令牌进行 api 调用的一般性问题。进行 api 调用所需的授权令牌每小时到期一次,因此我需要一种方法来以通用方式处理多个 api 调用。
我遇到了一个问题,如果我收到 401 错误,我会调用一个函数来使用刷新令牌来获取新的授权令牌,并且我想重新调用得到 401 错误的原始函数。
例如:
如果我在调用 getDetails() 时遇到 401 错误,我想调用 getNewAuthToken(),在我获得新的刷新令牌后,我想再次调用 getDetails()。
我想以某种方式执行此操作,以便如果我调用任何函数 getX() 并收到 401 错误,它会调用 getNewAuthToken() 然后再次调用原始函数 getX()
在不使用任何外部库等的情况下解决此问题的最佳方法是什么?最好的方法是使用某种回调函数吗?
我提供了我一直在实现的通用代码,但正如您所见,当我收到 401 错误时,它会调用 getNewAuthToken() 函数,但不会再次调用原始函数。如何修改此代码以根据需要运行?
import UIKit
import Combine
@Published var details: Details = nil
func getNewAuthToken(){
// here I request a token using the refresh token
}
func getDetails(){
self.getCurrentDetails{ details in
DispatchQueue.main.async {
self.details = details
}
}
}
func getCurrentDetails(_ completionHandler: @escaping (Details) -> ()) {
let url = "https://api.xxx.com/details"
guard let detailsURL = URL(string: url) else{
fatalError("URL not valid")
}
let authtoken = keychain.get("authtoken") ?? ""
var request = URLRequest(url: detailsURL)
request.httpMethod = "GET"
request.addValue("Bearer \(authtoken)", forHTTPHeaderField: "Authorization")
let session = URLSession.shared
let task = session.dataTask(with: request){
data, response, error in
let httpResponse = response as? HTTPURLResponse
// I request a new token
if(httpResponse?.statusCode == 401){
print("401")
self.getNewAuthToken()
return
}
do {
if(httpResponse?.statusCode != 200){
return
}
let decoder = JSONDecoder()
let details = try decoder.decode(Details.self, from:
data!)
completionHandler(details)
} catch let error2{
print(error2)
}
}
task.resume()
}
【问题讨论】:
标签: swift rest networking callback swiftui