【问题标题】:NSURLSessionUploadTask response content data is nullNSURLSessionUploadTask 响应内容数据为空
【发布时间】:2015-11-02 14:47:58
【问题描述】:

这是我目前使用NSURLSessionUploadTask 的地方:

  • iOS 应用程序使用 POST 启动 NSURLSessionUploadTask
  • 服务器收到 HTTP POST 请求
  • 服务器读取请求内容以便上传数据
  • 服务器向 iOS 发送 HTTP 响应,包括以下内容:
HTTP/1.1 200 正常 服务器:BaseHTTP/0.3 Python/2.7.10 日期:格林威治标准时间 2015 年 10 月 30 日星期五 16:15:21 内容类型:文本/html 内容长度:96 POST RESPONSE

文件已上传。

  • iOS 应用程序接收响应,NSLogs 响应通过NSURLSessionTaskDelegate -> URLSession:task:didCompleteWithError:
{ URL: http://10.157.239.129:42000/ } { 状态码: 200, headers { “内容长度”= 96; “内容类型”=“文本/html”; 日期 =“格林威治标准时间 2015 年 10 月 30 日星期五 16:15:21”; 服务器 = "BaseHTTP/0.3 Python/2.7.10"; } }
  • 然而,当我尝试NSLog的响应内容时,方法NSURLSessionTaskDelegate: -> URLSession:dataTask:didReceiveData:
- (void)URLSession:(NSURLSession *)session 数据任务:(NSURLSessionDataTask *)数据任务 didReceiveData:(NSData *)数据 { // 当数据任务接收到一些数据时调用(不适用于直接上传?) 如果(数据!= NULL) { NSLog(@"%s: %@", __PRETTY_FUNCTION__,[[NSString alloc] initWithData:数据编码:NSUTF8StringEncoding]); } 别的 { NSLog(@"%s: 但没有收到实际数据。", __PRETTY_FUNCTION__); } // 如果我们不在“活动”或前台,则将一些后台信息记录到控制台 如果(UIApplication.sharedApplication.applicationState != U​​IApplicationStateActive) { [BackgroundTimeRemainingUtility NSLog]; } }
  • 被称为我得到这个输出:
2015-10-30 12:15:22.648 NSURLSessionUploadTaskExample[215:7286] -[ViewController URLSession:dataTask:didReceiveData:]: (null)
  • 奇怪的是,如果数据为空,响应不应该触发 if 语句块!
  • 我也有证据表明响应数据是通过 Wireshark 发送到 iOS 应用程序的。这是来自服务器的 HTTP 响应的数据包捕获:

谁能告诉我为什么 iOS 似乎丢失了 HTTP 响应中的内容?

【问题讨论】:

标签: ios nsurlsessionuploadtask


【解决方案1】:

因为我能够跟踪从服务器到 iOS 应用程序的 HTTP 200 响应,我怀疑 iOS 应用程序有问题。我在该行设置了一个断点:

NSLog(@"%s: %@", __PRETTY_FUNCTION__,[[NSString alloc] initWithData:数据编码:NSUTF8StringEncoding]);

并使用调试器检查data 对象:

响应内容中的 96 个字节中的每一个都到达了NSURLSessionTaskDelegate: -> URLSession:dataTask:didReceiveData:,因此NSLog 中的NSString 解码有问题。现在事情变得有意义了。我发送的是 96 字节的 ASCII 响应,而不是 96 字节的 UTF8 响应!

我用以下代码替换了NSString 解码器:

NSLog(@"%s: %@", __PRETTY_FUNCTION__,[[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding: NSASCIIStringEncoding]);

通过以下输出解决了问题:

2015-11-02 10:04:47.086 NSURLSessionUploadTaskExample[561:363449]-[ViewController URLSession:dataTask:didReceiveData:]: POST RESPONSE文件已上传。

我还在 github here 上放了一个非常基本的 NSURLSessionUploadTask 示例应用程序和网络服务器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多