Swift 使用刷新令牌获取新授权令牌并重复失败的api调用

Swift 使用刷新令牌获取新授权令牌并重复失败的api调用,swift,rest,networking,callback,swiftui,Swift,Rest,Networking,Callback,Swiftui,我有一个关于在swift中使用令牌进行api调用的一般性问题。进行api调用所需的授权令牌每小时过期一次,因此我需要一种方法以通用方式处理多个api调用 我面临一个问题,如果我得到一个401错误,我调用一个函数来使用刷新令牌来获得一个新的授权令牌,我想重新调用得到401错误的原始函数 例如: 如果我在调用getDetails()时遇到401错误,我想调用getNewAuthToken(),在我得到一个新的刷新令牌后,我想再次调用getDetails() 我想这样做,如果我调用任何函数getX()

我有一个关于在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()
}

我认为不需要像“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()将再次被调用以满足原始请求。是的,这就是计划。你能再投票一点吗?你解释了流程。我说得对。我想我没有什么要解释的了。