Swift 使用刷新令牌获取新授权令牌并重复失败的api调用
我有一个关于在swift中使用令牌进行api调用的一般性问题。进行api调用所需的授权令牌每小时过期一次,因此我需要一种方法以通用方式处理多个api调用 我面临一个问题,如果我得到一个401错误,我调用一个函数来使用刷新令牌来获得一个新的授权令牌,我想重新调用得到401错误的原始函数 例如: 如果我在调用Swift 使用刷新令牌获取新授权令牌并重复失败的api调用,swift,rest,networking,callback,swiftui,Swift,Rest,Networking,Callback,Swiftui,我有一个关于在swift中使用令牌进行api调用的一般性问题。进行api调用所需的授权令牌每小时过期一次,因此我需要一种方法以通用方式处理多个api调用 我面临一个问题,如果我得到一个401错误,我调用一个函数来使用刷新令牌来获得一个新的授权令牌,我想重新调用得到401错误的原始函数 例如: 如果我在调用getDetails()时遇到401错误,我想调用getNewAuthToken(),在我得到一个新的刷新令牌后,我想再次调用getDetails() 我想这样做,如果我调用任何函数getX()
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()
}
我认为不需要像“getX()”这样分离函数来处理这个问题。您只需要一个完成处理程序
func getNewAuthToken(completionHandler: () -> Void) {
// here I request a token using the refresh token
completionHandler()
}
func someNetworkCall() {
getNewAuthToken {
someNetworkCall()
}
}
我只会在收到401错误时调用getNewAuthToken。在我粘贴的代码中,流程如下:我将调用getDetails(),然后在那里调用getCurrentDetails(),我将得到一个401错误,然后调用getNewAuthToken()。在我得到一个新的身份验证令牌之后,getDetails()或getCurrentDetails()将再次被调用以满足原始请求。是的,这就是计划。你能再投票一点吗?你解释了流程。我说得对。我想我没有什么要解释的了。