在这上面摧毁我的大脑。我有一个使用OAuth2的应用程序,我请求有一个到期的令牌。我试图找出检查过期的最佳方法,如果它已过期,请在发送新的API请求之前请求新的令牌。我有一个来自AlamoFire的Router类的枚举,它检查一个访问令牌,如下所示:
UserManager.getUser()?.getUserAccessToken()
该方法如下:
func getUserAccessTokenForRequest() -> String? {
if isTokenValid() {
return self.accessToken
}
else {
var localAccessToken : String?
let request = DataManager.currentRequest as Request?
DataManager.currentRequest?.cancel()
DataManager.refreshToken{ (success, value) in
if success {
if let returnedToken : String = value as? String {
request?.resume()
}
} else {
if let localError: AnyObject = value {
}
}
}
return nil;
}
}
但是当我恢复初始请求时,它是零,因为它已经完成并收到令牌无效的响应。我在遇到异步任务之前遇到了问题(因为它们是异步的)。我想知道这个最好的架构会是什么样子。在我提出请求之前,我可以检查令牌在我的数据管理器中是否有效。但是,我不想为每次通话都这样做。
覆盖创建请求方法是最好的方法吗?
答案 0 :(得分:1)
刚刚发现: Alamofire : How to handle errors globally
前一段时间我和AFNetworking
做了类似的事情,我猜你可以为Alamofire
实现类似的功能:
// if token was expired refresh it and retry
private class func refreshTokenAndRetry(operation: AFHTTPRequestOperation, success: (response: AnyObject!) -> Void, failure: (error: NSError!) -> Void) {
Client.refreshToken(
success: { (credential: AFOAuthCredential!) -> Void in
if credential != nil {
println("Refreshed token and retrying operation")
var request = operation.request.mutableCopy() as! NSMutableURLRequest
request.addValue(nil, forHTTPHeaderField: "Authorization")
request.addValue("Bearer \(credential.accessToken)", forHTTPHeaderField: "Authorization")
let retryOperation = requestOperationManager.HTTPRequestOperationWithRequest(
request,
success: { (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) in
success(response: responseObject)
},
failure: { (operation: AFHTTPRequestOperation!, error: NSError!) in
failure(error: error)
}
)
retryOperation.start()
}
},
failure: { (error) -> Void in
failure(error: error)
}
)
}
您缺少的是创建原始请求的可变副本,然后在标头中设置令牌并使用新请求创建新操作。