在错误块中调用 AccessToken Api 是使用 Alamofire 进行网络请求的正确方法

问题描述

在我的应用程序中,我连接到服务器,对于每个 API 请求,我需要发送一个访问令牌,访问令牌最初是在登录 API 中收到的,它会在 14 分钟后过期。

对于快速的网络请求,我使用的是 Alamofire。

检查下面附上的代码。


import Foundation
import Alamofire
import ObjectMapper
import AlamofireObjectMapper

protocol APIRequestHandler  {
    // default
}

extension APIRequestHandler where Self : URLRequestBuilder {
    // For Response Object
    
    func downloadFile<T: AnyObject>(modelType: T.Type,url: String = "",success: @escaping ( _ servicResponse: AnyObject) -> Void,fail: @escaping ( _ error: NSError) -> Void,showHUD: Bool)  where T: Mappable {
        download(self).response { (response) in
            //
        }
    }
    func send<T: AnyObject>(modelType: T.Type,data: [UIImage]? = nil,showHUD: Bool)  where T: Mappable {
        if let data = data {
            uploadToServerWith(modelType: modelType,images: data,request: self,parameters: self.parameters,success: success,fail: fail)
        } else {
            // For User without SSL remove NetworkClient. from Below line
            NetworkClient.request(self).authenticate(user: APIAuthencationUserName,password: APIAuthencationPassword).validate().responseObject { (response: DataResponse<T>) in
                switch response.result {
                case .success(let objectData):
                    success(objectData)
                    break
                case .failure(let error):
                    do {
                        let json = try JSONSerialization.jsonObject(with: response.data!,options: []) as? [String : Any]
                        //print(json)
                    } catch {
                        print(error)
                    }
                    if error.localizedDescription == RefreshTokenFailed {
                        self.getAccessTokenAPI(completion: { (value) in
                            if value == TOKEN_SAVED {
                                self.send(modelType: modelType,fail: fail,showHUD: showHUD)
                                return
                            }else {
                                fail(error as NSError)
                            }
                        })
                    }else {
                        fail(error as NSError)
                    }
                }
            }
        }
    }
    
    // For Response Header
    func submit(completionHandler: @escaping (_ response: DataResponse<Any>) -> Void)  {
        NetworkClient.request(self).responseJSON { (response: DataResponse) in
            completionHandler(response as DataResponse)
        }
    }
    
    
    
    func getAccessTokenAPI(completion: @escaping (_ result: String) -> Void) {
        let serviceName = SERVER_URL +  "refresh-token"
        var request =     URLRequest(url: URL(string: serviceName)!)
        request.httpMethod = "GET"
        request.setValue("application/json",forHTTPHeaderField: "Content-Type")
        request.setValue(String(describing: UserDefaults.standard.getRefreshToken()),forHTTPHeaderField: "X-Customer-Refresh-Token")
        request.timeoutInterval = 120 // 10 secs
        // Alamofire // DefaultAlamofireManager.sharedManager.
        Alamofire.request(request as URLRequestConvertible).authenticate(user: APIAuthencationUserName,password: APIAuthencationPassword).validate().responseJSON { (response) in
            
            if let JSON = response.result.value {
                print("JSON: \(JSON)")
            }
            if let accessToken = response.response?.allHeaderFields["X-Customer-Access-Token"] {
                print(accessToken)
                UserDefaults.standard.setApplicationAccessTokens(accessToken: accessToken as! String)
            }else if let accessToken = response.response?.allHeaderFields["x-customer-access-token"]{
                UserDefaults.standard.setApplicationAccessTokens(accessToken: accessToken as! String)
            }
            if let refreshToken = response.response?.allHeaderFields["X-Customer-Refresh-Token"] {
                print(refreshToken)
                UserDefaults.standard.setApplicationRefreshTokens(refreshToken: refreshToken as! String)
            }else if let refreshToken = response.response?.allHeaderFields["x-customer-refresh-token"] {
                UserDefaults.standard.setApplicationRefreshTokens(refreshToken: refreshToken as! String)
            }
            if let status = response.response?.statusCode {
                if status == 200 {
                    completion("TokenSaved")
                }else{
                    completion("NotTokenAccess")
                }
            } else {
                completion("NotTokenAccess")
            }
        }
    }
}

struct UploadData {
    var data: Data
    var fileName,mimeType,name: String
}

extension APIRequestHandler {
    
    
    private func uploadToServerWith<T: AnyObject>(modelType: T.Type,images:[UIImage],request: URLRequestConvertible,parameters: Parameters?,fail: @escaping ( _ error: NSError) -> Void) {
        print(modelType)
        upload(multipartFormData: { (multipartFormData) in
            var i = 0
            for image in images {
                let imageData = image.jpegData(compressionQuality: 0.0) //UIImageJPEGRepresentation(image,0.0)
                multipartFormData.append(imageData!,withName:  "files[\(i)]",fileName: "image.png",mimeType: "image/png")
                i = i + 1
            }
            guard let parameters = parameters else { return }
            for (key,value) in parameters {
                multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!,withName: key as String)
            }
        },with: request) { (response) in
            switch response {
            case .success(let requestUp,_,_):
                break
            case .failure(let error):
                fail(error as NSError)
            }
        }
    }
}







如果 Api 总是给出错误“AccessTokenFail”,我将面临一段时间的问题,它将卡在递归循环中。

任何更好的方法来解决这个问题。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...