Код состояния HTTP 0 - домен ошибки = NSURLErrorDomain?


94

Я работаю над проектом iOS.

В этом приложении я загружаю изображения с сервера.

Проблема:

При загрузке изображений я получаю время ожидания запроса . Согласно документации HTTP-код статуса тайм-аута запроса 408.

Но в моем приложении я получаю код состояния HTTP 0со следующей ошибкой

Ошибка домена = NSURLErrorDomain Code = -1001 «Истекло время ожидания запроса». UserInfo = 0xb9af710 {NSErrorFailingURLStringKey = http://xxxx.com/resources/p/PNG/1383906967_5621_63.jpg , NSErrorFailingURLKey = http://xxxx.com/resources/p/PNG/1383906967_5621_63.jpg outcription = The NSLocalized requestData ., NSUnderlyingError = 0x13846870 "Время ожидания запроса истекло."}

Во время поиска в Интернете я не нашел информации о коде состояния HTTP 0.

Кто-нибудь может мне это объяснить?


1
Также может произойти из-за смешанного содержимого developer.mozilla.org/en-US/docs/Web/Security/Mixed_content
— devasghar

Ответы:


97

Код состояния HTTP отсутствует. Вы видите 0, возвращаемый API / библиотекой, которую вы используете. Для этого вам нужно будет проверить документацию.


7
В IE10 есть странная ошибка: при получении кода состояния 401 или 403 он интерпретирует его как код состояния 0. В моей голове код состояния 0 - это ошибка, потому что явно что-то не так.
— Gaui

5
Тайм- аут
— шлюза

Ответ неверный. Код состояния 0 существует, когда браузер не может подключиться к серверу. Когда вы получаете разные ошибки, например, 504, это связано с настройками обратного прокси.
— Никон

Ответ правильный. Код состояния HTTP отсутствует. Вы можете увидеть его как значение, возвращаемое API, но не в ответном сообщении HTTP.
— Джулиан Решке,

75

Код состояния 0 в NSHTTPURLResponseобъекте обычно означает, что ответа не было, и может возникнуть по разным причинам. Сервер никогда не вернет статус 0, поскольку это недопустимый код статуса HTTP.

В вашем случае вы появляетесь получаете код состояния 0, потому что время ожидания запроса истекло, а 0 - это просто значение по умолчанию для свойства. Сам тайм-аут может быть по разным причинам, например, сервер просто не отвечает вовремя, блокируется брандмауэром или все ваше сетевое соединение не работает. Обычно в последнем случае телефон достаточно умен, чтобы знать, что у него нет сетевого подключения, и он немедленно выйдет из строя. Однако он все равно не сработает с очевидным кодом состояния 0.

Обратите внимание, что в случаях, когда код состояния равен 0, настоящая ошибка фиксируется в возвращаемом NSErrorобъекте, а не в файле NSHTTPURLResponse.

По 408моему опыту, статус HTTP встречается довольно редко. Сам никогда не встречал. Но он, по-видимому, используется в тех случаях, когда клиенту необходимо поддерживать активное соединение сокета с сервером, и сервер ожидает, что клиент отправит больше данных через открытый сокет, но этого не происходит в течение заданного промежутка времени и сервер завершает соединение с помощью 408кода состояния, по сути говоря клиенту, что «у вас слишком много времени».


1
Прекрасное объяснение.
— CouchDeveloper



5

Исходя из моего ограниченного опыта, я бы сказал, что следующие два сценария могут вызвать реакцию status code: 0, имейте в виду; их могло быть и больше, но я знаю этих двоих:

  • ваше соединение может медленно реагировать.
  • или, возможно, внутренний сервер недоступен.

Дело в том, что status: 0это немного общий характер, и их может быть больше вариантов использования, которые вызывают пустое тело ответа.


Это статус API, а не статус HTTP. Если ответа HTTP не было, значит, в нем не было кода состояния HTTP.
— Маркиз Лорн,

Код состояния 0 не означает, что существует код ответа HTTP, но это может быть проблемой, если ваш сервер недоступен.
— Ravi

5

Код состояния «0» может появиться по трем причинам:
1) Клиент не может подключиться к серверу
2) Клиент не может получить ответ в течение периода ожидания
3) Запрос был «остановлен (прерван)» Клиентом.

Но эти три причины не стандартизированы


У вас есть какой-нибудь источник на это?
— rgoliveira

любой исходный код применим для тестирования первых двух точек, вам просто нужен запрос на основе ajax. но третий происходит при отмене запроса пользователя, это можно сделать с помощью функции прерывания в jquery.
— Hariprasath Yadav

4

HTTP-ответ 0 не является стандартным HTTP-ответом. Но это указывает на то, что клиент не может подключиться к серверу и, следовательно, истекло время ожидания.


2

Мы получили ошибку:

GET http: //localhost/pathToWebSite/somePage.aspx вызвал ошибку http.status: 0

Этот вызов выполняется из задачи Windows, которая вызывает файл VBS, поэтому для устранения проблемы мы указали браузер на URL-адрес, и мы получили ошибку конфиденциальности:

Ваше соединение не приватное

Злоумышленники могут пытаться украсть вашу информацию с localhost (например, пароли, сообщения или кредитные карты). NET :: ERR_CERT_COMMON_NAME_INVALID

Автоматически сообщать сведения о возможных нарушениях безопасности в Google. Политика конфиденциальности Вернуться к безопасности Этот сервер не смог доказать, что это localhost; его сертификат безопасности находится с * .ourdomain.com. Это может быть вызвано неправильной конфигурацией или злоумышленником, перехватывающим ваше соединение. Выучить больше.

Это связано с тем, что у нас есть правило перезаписи URL-адресов IIS, которое заставляет соединения использовать https. Это правило перенаправляет http: // localhost на https: // localhost, но наш сертификат SSL основан на внешнем доменном имени, а не на localhost, поэтому ошибка сообщается как код состояния 0. Таким образом, ошибка конфиденциальности может быть очень неясной причиной. для этого кода состояния 0.

В нашем случае решением было добавить исключение к правилу для localhost и разрешить http: //localhost/pathToWebSite/somePage.aspx использовать http. Непонятно, да, но я столкнусь с этим в следующем году и теперь найду свой ответ в поиске Google.


2

Иногда браузер отвечает на обработчик ошибок http с помощью объекта ошибки, для которого установлен статус 0, даже если вы видите статус ошибки 404, 401, 500 и т. Д. В сети.

Это может произойти, если ваше приложение и API находятся в разных доменах - применяется механизм CORS. Согласно CORS для каждого запроса API браузер отправляет два запроса:

  1. предварительный запрос OPTIONS, чтобы понять, разрешает ли API запрос Actual / Origin.
  2. когда API разрешает (ответ на запрос OPTIOS со статусом 204 и правильными заголовками Access-Control-Allow-Origin) - браузер отправляет следующий запрос «Actual / Origin».

В приложении мы обрабатываем ответ об ошибке для «Фактический / исходный запрос», и если «предварительный запрос OPTIONS» завершился неудачно - браузер не предоставляет правильный объект HttpError для обработчика ошибок http. Итак, чтобы получить правильный статус HTTP-ответа - убедитесь, что вы получили успешный предполетный ответ на запрос OPTIONS.




Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.