【问题标题】: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 != UIApplicationStateActive)
{
[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 示例应用程序和网络服务器。