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);
];
success
和 failure
块都没有被调用。如果我用
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 错误而挂起的主要内容,如果未能解决你的问题,请参考以下文章