iOS Restkit 需要调用NewBodyStream

标签 ios objective-c restkit

我通过 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/

相关文章:

objective-c - 如何在 iOS 中使用 Reskit 上传文件

ios - 以编程方式设置图像的大小

ios - 使用 React-native 的 IOS 版 Google SignIn(博览会)

IOS 10.2 UserNotifications 关于简单警报和角标(Badge)的问题

ios - 如何在 iOS Objective C 中向 Rest Web 服务请求添加 token

ios - 如何在 iOS 7 中执行动态/计算属性

ios - 快速监视可变数组的计数。

ios - 无法在 Firebase 函数中读取 null 的属性

ios - 维护 RKObjectManager/AFHTTPClient 请求排序

ios - 当我将架构更新为 arm64 时,Restkit 失败