Код состояния 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.

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

Ирфан ДАТСКИЙ
источник

Ответы:

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кода состояния, по сути говоря клиенту, что «у вас слишком много времени».

devios1
источник
1
Прекрасное объяснение.
CouchDeveloper
10

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

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

ВДН
источник
В предоставленной вами ссылке нет информации о коде состояния HTTP 0.
Irfan DANISH
10

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

Анкит Кумар Гупта
источник
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.

Дмитрий Кущ
источник
-1

По таймауту выхода из шлюза статус будет нулевым при обратном вызове при ошибке.

.error( function( data,status,headers,config){
    console.log(status) 
 }

Коды состояния HTTP

Прашоб
источник