我正在尝试让我的应用处理HTTP客户端错误。理想情况下,无论发生何种错误,我都希望在发生此类错误时运行静态方法。
似乎我做错了 - 我试图添加一个RKDynamicResponseDescriptor
来调用该方法,但它没有被调用。每当我的服务器响应错误时,请求永远不会完成(网络活动指示器继续旋转,AFNetworkingOperationDidFinishNotification
永远不会发布。)
我可以通过创建这样的新AFHTTPRequest
请求来重现行为:
request = [[RKObjectManager sharedManager].HTTPClient requestWithMethod:@"GET" path:@"events" parameters:nil];
AFHTTPRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
NSLog(@"%@", JSON);
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
}];
不会调用success
和failure
块。如果我用
request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:url]];
块被调用。如何让RestKit处理HTTP错误响应?
编辑1:当服务器返回带有身份验证质询的401
时,显然会发生这种情况。我已尝试在RKHTTPRequestOperation
的{{1}}中设置断点,但未触发。我的提琴手显示只发送了一个请求。
答案 0 :(得分:1)
经过大量的摆弄,我想我找到了这个问题的原因。启用SSL固定时,AFUrlConnectionRequest
类实现connection:willSendRequestForAuthenticationChallenge:
委托方法。如果身份验证质询与SSL无关,则实现只会返回。
来自documentation of NSUrlConnectionDelegate:
此方法允许委托人立即做出有关连接身份验证的明智决定。如果委托实现此方法,则无需实现
- connection:canAuthenticateAgainstProtectionSpace:,
- connection:didReceiveAuthenticationChallenge:,
- connectionShouldUseCredentialStorage :.
实际上,没有调用这些其他方法。
不会调用这些方法,因此RestKit永远不会知道该请求导致HTTP错误401.
我通过删除此定义来解决问题,因此未实现委托方法:
#define _AFNETWORKING_PIN_SSL_CERTIFICATES_