Данные содержимого ответа NSURLSessionUploadTask имеют значение null

Вот где я до сих пор с NSURLSessionUploadTask:

  • Приложение iOS запускает NSURLSessionUploadTask с помощью POST
  • сервер получает запрос HTTP POST
  • сервер считывает содержимое запроса, поэтому данные загружаются
  • сервер отправляет HTTP-ответ на iOS, состоящий из следующего:
HTTP/1.1 200 OK
Server: BaseHTTP/0.3 Python/2.7.10
Date: Fri, 30 Oct 2015 16:15:21 GMT
Content-Type: text/html
Content-Length: 96

<html><head><title>POST RESPONSE</title></head><body><p>The file was uploaded.</p></body></html>
  • Приложение iOS получает ответ и NSLogs ответ через NSURLSessionTaskDelegate -> URLSession:task:didCompleteWithError:
<NSHTTPURLResponse: 0x15d95110> { URL: http://10.157.239.129:42000/ } { status code: 200, headers {
    "Content-Length" = 96;
    "Content-Type" = "text/html";
    Date = "Fri, 30 Oct 2015 16:15:21 GMT";
    Server = "BaseHTTP/0.3 Python/2.7.10";
} }
  • однако, когда я пытаюсь NSLog получить содержимое ответа, когда метод NSURLSessionTaskDelegate: -> URLSession:dataTask:didReceiveData:
- (void)URLSession:(NSURLSession *)session
          dataTask:(NSURLSessionDataTask *)dataTask
    didReceiveData:(NSData *)data
{
    // Called when data task has received some data (not applicable for straight upload?)
    if (data != NULL)
    {
        NSLog(@"%s: %@", __PRETTY_FUNCTION__,[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    }
    else
    {
        NSLog(@"%s: but no actual data received.", __PRETTY_FUNCTION__);
    }

    // If we are not in the "active" or foreground then log some background information to the console
    if (UIApplication.sharedApplication.applicationState != UIApplicationStateActive)
    {
        [BackgroundTimeRemainingUtility NSLog];
    }
}
  • называется я получаю это для вывода:
2015-10-30 12:15:22.648 NSURLSessionUploadTaskExample[215:7286] -[ViewController URLSession:dataTask:didReceiveData:]: (null)
  • что странно, так это то, что ответ не должен был запускать блок операторов if, если данные равны нулю!
  • У меня также есть доказательства того, что данные ответа БЫЛИ отправлены в приложение iOS через Wireshark. Вот захват пакета HTTP-ответа с сервера: Wireshark

Может ли кто-нибудь сказать мне, почему iOS теряет содержимое в ответе HTTP?


person drbobdugan    schedule 02.11.2015    source источник
comment
Не могли бы вы изучить этот stackoverflow.com/q/38831704/5730180?   -  person RajuBhai Rocker    schedule 09.08.2016


Ответы (1)


Поскольку мне удалось отследить ответ HTTP 200 от сервера к приложению iOS, я заподозрил, что в приложении iOS возникла проблема. Ставлю точку останова на строку:

NSLog(@"%s: %@", __PRETTY_FUNCTION__,[[NSString alloc] initWithData:data encoding: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>The file was uploaded.</p></body></html>

Я также разместил очень простой пример приложения NSURLSessionUploadTask и веб-сервера на github здесь.

person drbobdugan    schedule 02.11.2015