我通过 Restkit 向服务器执行请求。它运行良好,但有时会调用该方法:
- (NSInputStream *)connection:(NSURLConnection *)connection needNewBodyStream:(NSURLRequest *)request
{
RKResponseIgnoreDelegateIfCancelled(nil);
RKLogWarning(@"RestKit was asked to retransmit a new body stream for a request. Possible connection error or authentication challenge?");
return nil;
}
而且我没有收到服务器的响应。
为什么叫它?
最佳答案
当 NSURLConnection
通过 NSMutableRequest 的 setHTTPBodyStream:
方法使用指定为 NSInputStream
的数据源执行 POST、PUT 或 PATCH 请求时,它将打开流并从中读取字节以将数据发送到服务器。
在大多数情况下这会起作用,因为这个请求实际上是服务器所期望的请求。
但在某些情况下,服务器无法立即处理此 POST 请求,例如当服务器需要身份验证时。为了完成身份验证,服务器向客户端发送一个“重定向响应”——从而忽略到目前为止收到的字节,这些字节是已经从客户端发送的部分 POST 数据。客户端需要通过发送凭据进行身份验证,然后从开始再次发送原始请求。
现在,NSStream
无法“倒带”。这意味着,一旦客户端打开一个流并从中读取字节并且它的当前位置已经移动,就不能将位置设置为开始。从概念上讲,它是一个“前向迭代器”。为了从头开始,必须重新创建、打开和读取 NSStream
。不幸的是,NSURLRequest
无法处理此问题,因为它不知道流来自何处以及如何创建它。
当NSURLConnection
需要“重启”请求中设置的body数据流时,NSURLConnection
发送消息connection:needNewBodyStream:
。
委托(delegate)需要提供一个新创建的流,可能与创建第一个流的方式相同,并通过 setHTTPBodyStream:
为它分配 NSURLRequest
。
关于iOS Restkit 需要调用NewBodyStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17165565/