0

我通过 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;
}

而且我没有收到来自服务器的响应。

为什么叫它?

4

1 回答 1

3

当使用通过 NSMutableRequest方法NSURLConnection指定的数据源执行 POST、PUT 或 PATCH 请求时,它将打开流并从中读取字节以将数据发送到服务器。NSInputStreamsetHTTPBodyStream:

在大多数情况下,这将起作用,因为此请求实际上是服务器所期望的请求。

但是,在某些情况下,服务器无法立即处理此 POST 请求,例如当服务器需要身份验证时。为了完成身份验证,服务器向客户端发送“重定向响应” - 从而忽略到目前为止接收到的字节,这是已经从客户端发送的部分 POST 数据。客户端需要通过发送凭据进行身份验证,然后从 start 再次发送原始请求。

现在,NSStream不能“倒带”。这意味着,一旦客户端打开了一个流并从中读取字节并且它的当前位置已经移动,就不能将位置设置为开始。从概念上讲,它是一个“前向迭代器”。为了从头开始,NSStream必须重新创建、打开并再次阅读。不幸的是,它NSURLRequest无法处理这个问题,因为它不知道流的来源以及如何创建它。

NSURLConnection需要“重新启动”请求中设置的主体数据流时,NSURLConnection发送消息connection:needNewBodyStream:

委托需要提供一个新创建的流,可能与创建第一个流的方式相同,并为其分配NSURLRequestvia setHTTPBodyStream:

于 2013-06-18T11:55:00.543 回答