即使“Content-Length”标头具有值,多部分表单的 NSURLSessionDataTask 也会返回空数据

Posted

技术标签:

【中文标题】即使“Content-Length”标头具有值,多部分表单的 NSURLSessionDataTask 也会返回空数据【英文标题】:NSURLSessionDataTask for multipart form returns empty data even though "Content-Length" header has value 【发布时间】:2016-01-22 14:18:56 【问题描述】:

我正在尝试使用基于 NSURLSession 和 NSURLSessionDataTask 块的 API 的this 示例使用多部分表单将多个图像上传到服务器。

此外,对于对服务器的所有调用,我将发送一个身份验证令牌,以验证我是否有权进行上传。

除了我上传并且我的身份验证令牌已过期的情况外,一切都运行良好。当令牌过期时,我应该会收到一个 HTTP 400 响应,其中的正文说过期的令牌是失败的原因(这适用于对服务器的所有其他调用)。

但是,当我的令牌过期时,对于多部分表单上传,我得到了预期的 400 响应,但 NSData 对象在完成块中返回

- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
                        completionHandler:(void (^)(NSData *data,
                                                    NSURLResponse *response,
                                                    NSError *error))completionHandler

为空。有趣的是 NSData 对象不是 nil,它只是一个空的 NSData 对象。

有趣的是,在响应对象中,我看到一个“Content-Length”标头,它是我希望看到的响应的长度,即“Content-Length”标头大于 0,但是NSData 对象为 0。

所以我的问题归结为,NSURLSession 是否有任何理由不会公开从服务器返回的数据?是否有关于在请求上设置“multipart-form”标头以使响应具有空正文?

【问题讨论】:

【参考方案1】:

我假设当您说“从完成块返回”时,您的真正意思是“从完成块内检查时”。

如果设置了错误,则空对象可能表示在等待服务器实际发送数据时连接超时。

否则,我有一个模糊的回忆,如果服务器返回某些结果代码,NSURLSession 任务不会检索错误页面的正文,并且您必须做一些事情来改变这种行为,比如实现一个自定义身份验证委托告诉它无论如何都要加载。但这是一个模糊而遥远的记忆,我在网上找不到任何细节,所以我可能记错了。

【讨论】:

以上是关于即使“Content-Length”标头具有值,多部分表单的 NSURLSessionDataTask 也会返回空数据的主要内容,如果未能解决你的问题,请参考以下文章

Content-Length 标头已存在

Content-Length 标头与分块编码

ERROR 验证错误:Lambda 函数结果验证失败,该函数尝试删除只读标头,标头名称:Content-Length

拒绝获取不安全的标头“Content-Length”

如何从使用 axios 发送的 POST 请求中获取 Content-Length 标头?

如何从跨域 Ajax 请求访问 Content-Length 标头?