RestKit 请求因 HTTP 错误而挂起

Posted

技术标签:

【中文标题】RestKit 请求因 HTTP 错误而挂起【英文标题】:RestKit requests hang on HTTP errors 【发布时间】:2013-05-31 10:52:37 【问题描述】:

我正在尝试让我的应用程序处理 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 时,这两种情况都会发生。我尝试在didReceiveAuthenticationChallenge 中的RKHTTPRequestOperation 中设置断点,但没有触发。我的 Fiddler 显示只发送了一个请求。

【问题讨论】:

【参考方案1】:

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

来自documentation of NSUrlConnectionDelegate:

此方法允许委托立即就连接身份验证做出明智的决定。如果delegate实现了这个方法,就不需要实现了

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

其实这些其他方法都没有被调用。

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

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

#define _AFNETWORKING_PIN_SSL_CERTIFICATES_

【讨论】:

您报告了这个错误吗?我想我可能会遇到同样的问题。

以上是关于RestKit 请求因 HTTP 错误而挂起的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra 因压缩和清理而挂起

Oozie-sqoop 工作流在 cloudera 中因心跳问题而挂起

如何在由于库函数而挂起的函数上实现超时? [复制]

Python套接字recv()由于硬件而挂起?

进程的挂起阻塞和睡眠

RestKit 在 PUT 请求时抛出 NSInternalInconsistencyException