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

Я работаю над проектом 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, NSLocalizedDescription = Истекло время ожидания запроса., NSUnderlyingError = 0x13846870 "Время ожидания запроса истекло."}

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

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


person Irfan DANISH    schedule 08.11.2013    source источник
comment
Также может произойти из-за разработчика смешанного содержимого . mozilla.org/en-US/docs/Web/Security/Mixed_content   -  person devasghar    schedule 01.12.2016


Ответы (11)


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

person Julian Reschke    schedule 08.11.2013
comment
В IE10 есть странная ошибка: при получении кода состояния 401 или 403 он интерпретирует его как код состояния 0. В моей голове код состояния 0 является ошибкой, потому что явно что-то не так. - person Gaui; 24.01.2015
comment
Ответ неверный. Код состояния 0 существует, когда браузер не может подключиться к серверу. Когда вы получаете разные ошибки, например, 504, то это вызвано настройками обратного прокси. - person Nickon; 10.04.2020
comment
Ответ правильный. Код состояния HTTP отсутствует. Вы можете увидеть его как значение, возвращаемое API, но не в ответном сообщении HTTP. - person Julian Reschke; 10.04.2020

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

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

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

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

person devios1    schedule 27.04.2015
comment
Прекрасное объяснение. - person CouchDeveloper; 09.08.2019

Ответ был пуст. В большинстве случаев коды будут иметь значения 1xx, 2xx, 3xx, 4xx, 5xx.

Список кодов состояния HTTP

person VDN    schedule 08.11.2013
comment
В предоставленной вами ссылке нет информации о коде состояния HTTP 0. - person Irfan DANISH; 08.11.2013

В iOS SDK. Когда ваш API вызывает тайм-аут, вы получаете для этого статус 0.

person Ankit Kumar Gupta    schedule 13.10.2014

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

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

person Hariprasath Yadav    schedule 14.09.2018
comment
Есть ли у вас какой-нибудь источник по этому поводу? - person rgoliveira; 22.01.2019
comment
любой исходный код применим для тестирования первых двух точек, вам просто нужен запрос на основе ajax. но третий происходит при отмене запроса пользователя, это можно сделать с помощью функции прерывания в jquery. - person Hariprasath Yadav; 25.01.2019

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

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

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

person Simple-Solution    schedule 17.06.2015
comment
Это статус API, а не статус HTTP. Если ответа HTTP не было, значит, в нем не было кода состояния HTTP. - person user207421; 13.08.2015
comment
Код состояния 0 не означает, что существует код ответа HTTP, но это может быть проблемой, если ваш сервер недоступен. - person Ravi; 17.06.2016

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

person shuaib ahmad    schedule 27.06.2018

Иногда браузер отвечает на обработчик ошибок 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.

person Dmitriy Kusch    schedule 18.01.2019

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

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

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

Ваше соединение не является приватным

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

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

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

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

person Jeff Mergler    schedule 05.05.2017

CORS в моем случае.

Однажды у меня был такой ответ в приложении для iOS. Решением стал отсутствующий Access-Control-Allow-Origin: * в заголовках.

Подробнее: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin

person olivier    schedule 14.08.2018

Это может произойти с ответом 401 http при использовании NSURLConnection.

См. NSURLConnection, возвращающий ошибку вместо ответа для 401

person mike nelson    schedule 21.01.2020