3

От apple's doc- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error сообщит только об ошибке на стороне клиента через параметр ошибки.Лучшая практика обработки HTTP-ошибок с помощью NSURLSession?

Примечание: NSURLSession не сообщает об ошибках сервера через параметр ошибки. Единственными ошибками, которые ваше приложение получает через параметр ошибки, являются ошибки на стороне клиента, такие как невозможность разрешить имя хоста или подключиться к хосту. Коды ошибок описаны в кодах ошибок загрузки URL. Ошибки на стороне сервера сообщаются через код состояния HTTP в объекте NSHTTPURLResponse.

Но тем не менее, когда я испытываю в iOS9 с NSURLSessionDataTask, кажется, в настоящее время яблока отображается ошибка HTTP для NSURLError. Например, 404 to NSURLErrorFileDoesNotExist. Этот факт ломает некоторые предположения, что мы имели раньше, и many snippet also take the error parameter as connection error, это будет абсолютно неправильно.


Я стараюсь Seach и найти Apple, возможно, упоминается только это изменение в NSURLSessionDownloadTask. И не очень хорошо документировано, как применяется эта карта.

В отличие от NSURLSessionDataTask или NSURLSessionUploadTask, NSURLSessionDownloadTask сообщает серверные ошибки сообщенные посредством кодов состояния HTTP, в соответствующие объекты NSError.


Лично я думаю, что команда от Apple Dev сделал большую ошибку; И документ по-прежнему несовместим и не выдерживает, даже два года не прошли никаких обновлений.

У кого-нибудь есть дополнительная информация об этом изменении, когда это введено? И что лучше всего отличить ошибку соединения и ошибку HTTP сейчас.

+0

попробуйте найти этот ответ: http: // stackoverflow.com/questions/2342579/http-status-code-for-update-and-delete? rq = 1 – Wink

+0

Каков соответствующий ответ/обсуждение по этой ссылке? – marosoaie

ответ

0

Ответ такой же, как и всегда. Если ваш сервер отправляет ошибки с кодом ошибки 200 (например, в ответ JSON), вам придется обработать эту проверку самостоятельно. В противном случае:

  • Если вам небезразличен какой-либо конкретный код состояния HTTP, отправляемый сервером, выполните метод делегирования didReceiveResponse и перехватите ошибку.
  • Если вам все равно, что запрос потерпел неудачу, и вам все равно, почему вы получите ошибку через параметр ошибки в вашем обратном вызове завершения, но вы не получите какую-либо конкретную ошибку.

Обратите внимание, что успех определяется как любой из:

  • Результат кода 200 (OK)
  • код Результат 304 (Not Modified)
  • редирект на страницу, которая возвращает 200 или 304

Если ваше определение отличается (например, если ваш сервер реагирует на недопустимые URL-адреса путем перенаправления на страницу с ошибкой), вам нужно будет добавить метод делегирования для детекса t перенаправление и рассматривать это как ошибку.

+0

Получать ответ не означает, что он не обратится к ошибке подключения. Мои вопросы - как отличить ошибку соединения и ошибку HTTP, а не смысл кода состояния. – Karl

+1

Если соединение падает до получения количества байтов, обещанных сервером (Content-Length), вы получите NSError. Вы можете получить одну из трех ошибок: IIRC - либо «NSURLErrorTimedOut», либо «SURLErrorNetworkConnectionLost» или «NSURLErrorNotConnectedToInternet». – dgatwood

+0

Цель этой фразы в документации заключалась не в том, чтобы указать, что ошибка на стороне сервера никогда не будет генерировать объект NSError, а указывает на то, что это не гарантировано *. Ошибка на стороне сервера может быть сообщена другими способами, например, в словаре JSON, путем перенаправления на страницу с Fail Whale и т. Д., Не все из которых могут быть обязательно обнаружены системой загрузки. Если ваш сервер сообщает об ошибках любым из этих способов или если сервер отправляет обратно неожиданные данные (например, HTML вместо JSON), ваше приложение должно правильно определить ошибку и сделать правильную работу. – dgatwood

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