问题描述
在我的应用程序中,我连接到服务器,对于每个 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 (将#修改为@)