1

这是我到目前为止的地方NSURLSessionUploadTask

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

<html><head><title>POST RESPONSE</title></head><body><p>文件已上传。</p></body></html>
  • iOS 应用程序接收响应并NSLogs通过NSURLSessionTaskDelegate -> URLSession:task:didCompleteWithError:
<NSHTTPURLResponse: 0x15d95110> { 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 响应中的内容?

4

1 回答 1

0

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

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

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

在此处输入图像描述

响应内容中的 96 个字节中的每一个都到达了, NSURLSessionTaskDelegate: -> URLSession:dataTask:didReceiveData:因此中的 NSString解码有问题NSLog。现在事情变得有意义了。我发送的是 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:]:<html><head><title>POST RESPONSE</title></head><body>< p>文件已上传。</p></body></html>

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

于 2015-11-02T15:05:47.943 回答