Что означает код статуса HTTP 0

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

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

Проблема:

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

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

Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." 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=The request timed out., NSUnderlyingError=0x13846870 "The request timed out."}

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

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

15 ответов

Решение

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

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

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

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

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

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

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

В iOS SDK При превышении времени ожидания вызова API вы получаете статус 0 для этого.

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

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

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

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

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

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

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

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

В Приложении мы обрабатываем ответ "Ошибка" для "Актуального / Исходного запроса", и если "запрос preflight OPTIONS" не удался - браузер не выдает правильный объект HttpError для обработчика ошибок http. Таким образом, чтобы получить правильный статус ответа http - обязательно получите предварительный запрос ответа OPTIONS.

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

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

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

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

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

Злоумышленники могут пытаться украсть вашу информацию с локального хоста (например, пароли, сообщения или кредитные карты). 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.

Я получил код состояния 0, когда мой URL-адрес начинается с file: //, т.е. когда нет сервера, но запрос получает файл из локальной файловой системы.

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

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

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

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

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

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

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

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

У меня есть java-скрипт ajax-клиент и сервер приложений expressjs

Код клиента выглядит так:

...
var status1 = xmlHttpRequest.status;
...

Код сервера выглядит так:

...
// An exception here results HTTP status codes in status1 (at client side above)
...
...
var reqDb = http.request(options, requestCompleteCallback);
...
...
function requestCompleteCallback(response) {
    ...
    // An exception here results in 0 in status1 (at client side above)
    ...
}

30 минут борьбы, чтобы понять это.
Надеюсь, этот пост поможет кому-то.

Удачи.

В моем случае это слишком старый движок WebKit, а администратор веб-сайта/веб-страницы неправильно настраивает параметры https.

Другие вопросы по тегам