You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中基于Alamofire的Refresh Token、重试计数及请求重发问题咨询

方案修改步骤

你现有代码的核心问题是getRefreshToken是异步执行,且没有绑定重试逻辑和重试次数限制,按以下步骤调整即可:

1. 改造getRefreshToken函数,新增异步完成回调

原函数内部的返回值无法同步传递给外部调用方,需新增回调参数传递刷新结果:

func getRefreshToken(completion: @escaping (Bool) -> Void) {
    DataProvider.main.serviceLogin(username:User, password:Pass, firmNo: FirmId , callback:{success, result in
        do{
            if success {
                let model = try JSONDecoder().decode(Login.self, from: result as! Data)
                if model.isSuccess == true {
                    DataProvider.main.token = model.token
                    completion(true)
                    return
                }
            }
            completion(false)
        } catch let e {
            print(e)
            completion(false)
        }
    })
}

2. 给getDataFromWeb新增重试次数参数,绑定重试逻辑

新增retryCount参数(默认值为0,首次调用不用传),设置最大重试次数(示例设为2,可自行调整),刷新token成功后重新发起请求,超过重试次数则走失败回调:

/// 最大重试次数,可根据业务调整
private let maxRetryCount = 2

@objc private func getDataFromWeb(params:NSMutableDictionary,
                                retryCount: Int = 0,
                                callback:@escaping (_ success:Bool, _ result:Any?)->(Bool)) -> Void {
    var method = HTTPMethod.get
    var encoding = URLEncoding.default as ParameterEncoding
    if(params["Method"] as! String == "POST"){
        method = HTTPMethod.post
        encoding = Alamofire.JSONEncoding.default
    }       
    
    Alamofire.request(url,
                      method:method,
                      parameters:pr,
                      encoding:encoding,
                      headers:[ "Accept":"application/json", "Authorization":"Bearer \(DataProvider.main.token ?? "")"])
        .downloadProgress(closure: { (progress) in
        //progress closure
        })
        .validate(statusCode: 200..<300)
        .response { [weak self] response in
            guard let self = self else { return }
            print(response.error?.localizedDescription)
            let code = response.response?.statusCode
            
            if code == 401 || code == 403, retryCount < self.maxRetryCount {
                // 未达最大重试次数,先刷新token
                self.getRefreshToken(completion: { refreshSuccess in
                    if refreshSuccess {
                        // 刷新成功,重试请求,重试次数+1
                        self.getDataFromWeb(params: params, retryCount: retryCount + 1, callback: callback)
                    } else {
                        // 刷新失败,走失败回调
                        _ = callback(false, response.data)
                    }
                })
            } else {
                // 非认证错误/已达最大重试次数,正常回调
                _ = callback(response.data?.count != 0, response.data)
            }
    }
}

改动说明

  • 重试次数通过参数传递,每次重试自动累加,到达上限后不再重试,避免无限循环
  • 刷新token成功后才会发起重试,且重试请求会自动带上新的token
  • 若刷新token失败直接返回错误,不会再重试

内容的提问来源于stack exchange,提问作者Tekhe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 14:51:01