1

我试图让我的应用程序处理 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显然,当服务器返回身份验证质询时,这两种情况都会发生。我尝试在RKHTTPRequestOperationin 中设置断点didReceiveAuthenticationChallenge,但未触发。我的 Fiddler 显示只发送了一个请求。

4

1 回答 1

1

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

NSUrlConnectionDelegate 的文档中

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

  • 连接:canAuthenticateAgainstProtectionSpace:,
  • 连接:didReceiveAuthenticationChallenge:,
  • 连接应该使用凭据存储:。

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

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

我通过删除这个定义解决了这个问题,所以没有实现委托方法:

#define _AFNETWORKING_PIN_SSL_CERTIFICATES_
于 2013-05-31T19:20:39.810 回答