2013-04-24 3 views
1

У меня есть следующий код: - (., Например, половина ответа JSON из API)Как проверить частичный ответ от sendAsynchronousRequest: queue: completeHandler :?

NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://some-example-domain.com/api"] 
              cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData 
             timeoutInterval:30.0]; 

[NSURLConnection sendAsynchronousRequest:theRequest 
            queue: [NSOperationQueue mainQueue] 
         completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
          if (!error && data) { 
           // success!! - no errors and data returned 
           NSLog(@"success"); 
          } else { 
           // error!! - something whent wrong 
           NSLog(@"failure: %@", [error localizedDescription]); 
          } 

         } 
]; 

, который хорошо работает кроме для нечетных случаев, когда сервер посылает только часть требуемого ответа (это еще является «успешным» в соответствии с моим заявлением «если»)

Есть ли способ использования этого блочного метода, который я могу проверить, чтобы убедиться, что полученные данные завершены?

Я попытался заглянуть в ответ NSURLResponse *, но не могу понять, как его использовать (или, если это действительно полезно в этом сценарии). Любые идеи о том, как тестировать «частично полученные» данные, возвращаемые блоком?

+0

Я думаю, что частичные данные будут проблемой на сервере. – woz

+0

@woz - да, проблема с сервером - но я хочу проверить частично полученный ответ от изворотливого сервера, прежде чем пытаться разобрать данные. –

+0

Не могли бы вы сделать это прямо в 'completeHandler'? – woz

ответ

1

Есть потенциально два различных режима отказа для этого запроса, которые не обрабатываются, и вы должны проверить их по отдельности:

  • «успешный» HTTP соединение, но некорректный ответ
  • «успешно» соединение HTTP, но код состояния указывает на проблемы на сервере

В случае NSURLConnection, то error только устанавливается, когда не удается установить соединение, не тогда, когда проблема сообщается с сервера (для экзамена например: ошибка 404 или ответ 330).

Вообще, когда вы говорите с HTTP или HTTPS службы, вам необходимо проверить -statusCode в NSURLResponse, что в случае этих услуг будет на самом деле быть NSHTTPURLResponse. Если на сервере есть ошибка, например 408 для запроса, запрошенного на сервере, вам необходимо обработать это отдельно от сбоя подключения (что приведет к установке error).

Даже если вы вернетесь на хороший [response statusCode] == 200, вы, вероятно, по-прежнему хотите проверить отклоненные ответы, которые вам понадобятся, когда вы будете разбирать возвращаемые данные. Это менее вероятный сценарий, но если сервер ошибочен, вы можете получить частичный ответ или отказ в кодировке.

+0

Спасибо за информацию NSHTTPURLResponse. 'statusCode' недоступен для' NSURLResponse', но если я его произвешу, то он будет доступен 'NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *) response;'. Как вы предположили, statusCode все еще '== 200' даже для частичного ответа. Я также отметил метод 'expectedContentLength'. У меня были надежды сравнить это с '[длиной данных]', однако это только когда-либо кажется мне ответом -1. Проверяя заголовки ответов HTTP с сервера, я отчетливо вижу «Content-Length: 2856». У вас был опыт работы с 'expectedContentLength'? –

+0

Я должен был упомянуть бросок явно. Я говорил с ним выше.Что касается вашего сервера, который отправляет вам неполный ответ с '200' и' 'ожидаемый конец Контента '', см. Последний абзац о проверке ваших данных в синтаксическом анализаторе, даже когда сервер отправляет обратно' 200'. Ответ не имеет 'expectedContentLength', потому что сервер не устанавливает поле« Content-Length: »в ответе. В принципе, вам придется строить распознавание плохих ответов в парсере, который вы используете, когда получаете данные (что в любом случае является хорошей идеей). – gaige

+0

У меня был успех с 'expectedContentLength', но только тогда, когда сервер знает длину до того, как транзакция начнет передавать данные, что в основном происходит при отправке файлов. Для скриптов и json это смешанный пакет, основанный на том, какая часть контента, о котором знает процесс http, до того, как он начнет передавать данные клиенту. – gaige

Смежные вопросы