即使“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 也会返回空数据的主要内容,如果未能解决你的问题,请参考以下文章
ERROR 验证错误:Lambda 函数结果验证失败,该函数尝试删除只读标头,标头名称:Content-Length