我有一个应该很常见的用例,但我找不到使用 AFNetworking 处理它的简单方法:
每当服务器为任何请求返回特定状态代码时,我想:
- 删除缓存的身份验证 token
- 重新验证(这是一个单独的请求)
- 重复失败的请求。
我认为这可以通过 AFHTTPClient
中的一些全局完成/错误处理程序来完成,但我没有发现任何有用的东西。那么,做我想做的事情的“正确”方法是什么?在我的 AFHTTPClient
子类中重写 enqueueHTTPRequestOperation:
,复制该操作并用一个 block 包装原始完成处理程序来执行我想要的操作(重新验证、排队复制的操作)?还是我完全走错了路?
谢谢!
编辑:删除了对 401 状态代码的引用,因为当我使用 token 身份验证时,这可能是为 HTTP 基本保留的。
最佳答案
我使用另一种方法通过 AFNetworking 2.0 执行此操作。
您可以子类化 dataTaskWithRequest:success:failure:
并用一些错误检查包装传递的完成 block 。例如,如果您使用 OAuth,您可以观察 401 错误(过期)并刷新您的访问 token 。
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)urlRequest completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))originalCompletionHandler{
//create a completion block that wraps the original
void (^authFailBlock)(NSURLResponse *response, id responseObject, NSError *error) = ^(NSURLResponse *response, id responseObject, NSError *error)
{
NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
if([httpResponse statusCode] == 401){
NSLog(@"401 auth error!");
//since there was an error, call you refresh method and then redo the original task
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
//call your method for refreshing OAuth tokens. This is an example:
[self refreshAccessToken:^(id responseObject) {
NSLog(@"response was %@", responseObject);
//store your new token
//now, queue up and execute the original task
NSURLSessionDataTask *originalTask = [super dataTaskWithRequest:urlRequest completionHandler:originalCompletionHandler];
[originalTask resume];
}];
});
}else{
NSLog(@"no auth error");
originalCompletionHandler(response, responseObject, error);
}
};
NSURLSessionDataTask *task = [super dataTaskWithRequest:urlRequest completionHandler:authFailBlock];
return task;
}
关于ios - AFNetworking:全局处理错误并重复请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12893837/