RestKit请求挂起HTTP错误

时间:2013-05-31 10:52:37

标签: ios restkit afnetworking

我正在尝试让我的应用处理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);
                    }];

不会调用successfailure块。如果我用

替换第一行
request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:url]];

块被调用。如何让RestKit处理HTTP错误响应?

编辑1:当服务器返回带有身份验证质询的401时,显然会发生这种情况。我已尝试在RKHTTPRequestOperation的{​​{1}}中设置断点,但未触发。我的提琴手显示只发送了一个请求。

1 个答案:

答案 0 :(得分:1)

经过大量的摆弄,我想我找到了这个问题的原因。启用S​​SL固定时,AFUrlConnectionRequest类实现connection:willSendRequestForAuthenticationChallenge:委托方法。如果身份验证质询与SSL无关,则实现只会返回。

来自documentation of NSUrlConnectionDelegate

  

此方法允许委托人立即做出有关连接身份验证的明智决定。如果委托实现此方法,则无需实现

     
      
  • connection:canAuthenticateAgainstProtectionSpace:,
  •   
  • connection:didReceiveAuthenticationChallenge:,
  •   
  • connectionShouldUseCredentialStorage :.
  •   
     

实际上,没有调用这些其他方法。

不会调用这些方法,因此RestKit永远不会知道该请求导致HTTP错误401.

我通过删除此定义来解决问题,因此未实现委托方法:

#define _AFNETWORKING_PIN_SSL_CERTIFICATES_