Что означает код статуса 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.
Исходя из моего ограниченного опыта, я бы сказал, что следующие два сценария могут вызвать реакцию status code: 0
, иметь ввиду; их может быть больше, но я знаю о тех двух:
- Ваше соединение может реагировать медленно.
- или, может быть, внутренний сервер недоступен.
Дело в том, status: 0
является немного общим, и их может быть больше вариантов использования, которые вызывают пустое тело ответа.
Иногда Браузер отвечает на обработчик ошибок http с помощью Error Object, который имеет статус 0, даже если вы видите состояние ошибки 404, 401, 500 и т. Д. В сети.
Это может произойти, если ваше приложение и API находятся в разных доменах - применяется механизм CORS. Согласно CORS для каждого запроса API браузер отправляет два запроса:
- запрос preflight OPTIONS, чтобы понять, разрешает ли API запрос Actual/Origin.
- когда 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)
}
У меня есть 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.