Ответ 1
Нет кода состояния HTTP 0. То, что вы видите, - это 0, возвращаемое API/библиотекой, которую вы используете. Для этого вам нужно будет проверить документацию.
Я работаю над проектом 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 внеочередного запроса, NSL., NSUnderlyingError = 0x13846870 "Время ожидания истекло."}
Во время поиска по интернету я не нашел информации о HTTP Status Code 0.
Кто-нибудь может мне это объяснить?
Нет кода состояния HTTP 0. То, что вы видите, - это 0, возвращаемое API/библиотекой, которую вы используете. Для этого вам нужно будет проверить документацию.
Код состояния 0 в объекте NSHTTPURLResponse
обычно означает, что ответа не было, и может произойти по разным причинам. Сервер никогда не вернет статус 0, так как это не является допустимым кодом статуса HTTP.
В вашем случае вы получаете код состояния 0, потому что запрос является тайм-аутом, а 0 является только значением по умолчанию для свойства. Тайм-аут сам по себе может быть по разным причинам, например, сервер просто не отвечает вовремя, блокируется брандмауэром или отключается вся сетевая связь. Обычно в случае последнего, хотя телефон достаточно умный, чтобы знать, что у него нет сетевого подключения, и он немедленно сработает. Тем не менее, он все равно будет работать с явным кодом состояния 0.
Обратите внимание, что в случаях, когда код состояния равен 0, реальная ошибка фиксируется в возвращаемом объекте NSError
, а не в NSHTTPURLResponse
.
Статус HTTP 408
довольно редко встречается в моем опыте. Я никогда не сталкивался с этим сам. Но, по-видимому, он используется в тех случаях, когда клиенту необходимо поддерживать активное подключение сокета к серверу, а сервер ожидает на клиенте отправки большего количества данных через открытый сокет, но это не в заданное время и сервер завершает соединение с кодом статуса 408
, по существу говоря клиенту "вы слишком долго".
В iOS SDK. Когда ваш API вызывает тайм-ауты, вы получаете для этого статус 0.
Ответ был пуст. В большинстве случаев коды будут записываться с 1xx, 2xx, 3xx, 4xx, 5xx.
Из моего ограниченного опыта я бы сказал, что следующие два сценария могут вызвать ответ status code: 0
, имейте в виду; их может быть больше, но я знаю об этих двух:
вещь такова, что status: 0
несколько обобщен, и их может быть больше случаев использования, которые вызывают пустые тела ответа.
HTTP-ответ 0 не является стандартным HTTP-ответом. Но это указывает на то, что клиент не смог подключиться к серверу и, следовательно, произошел тайм-аут
Мы получили сообщение об ошибке:
GET http://localhost/pathToWebSite/somePage.aspx поднял ошибку http.status: 0
Этот вызов выполняется из задачи Windows, которая вызывает файл VBS, поэтому для устранения проблемы указывается браузер для URL-адреса, и мы получаем сообщение о конфиденциальности:
Ваше соединение не является приватным
Атакующие могут пытаться украсть вашу информацию с локального хоста (например, пароли, сообщения или кредитные карты). NET:: ERR_CERT_COMMON_NAME_INVALID
Автоматически сообщать о возможных инцидентах безопасности в Google. Политика конфиденциальности Назад к безопасности Этот сервер не смог доказать, что он локальный; его сертификат безопасности от *.ourdomain.com. Это может быть вызвано неправильной конфигурацией или злоумышленником, перехватывающим ваш подключение. Подробнее...
Это связано с тем, что у нас есть правило перезаписи URL-адреса IIS, чтобы заставить подключения использовать https. Это правило отвлекает http://localhost до https://localhost но наш сертификат SSL основан на внешнем имени домена, а не localhost, поэтому ошибка, которая сообщается как код состояния 0. Таким образом, ошибка конфиденциальности может быть очень неясной причиной для этого кода состояния.
В нашем случае решение заключалось в том, чтобы добавить исключение из правила для localhost и разрешить http://localhost/pathToWebSite/somePage.aspx использовать http. Непонятно, да, но я буду сталкиваться с этим в следующем году, и теперь я найду свой ответ в поиске Google.
CORS в моем случае.
У меня был такой ответ в приложении для iOS один раз. Решением стало отсутствие Access-Control-Allow-Origin: *
в заголовках.
Подробнее: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin
Код состояния "0" может возникать по трем причинам.
1) Клиент не может подключиться к серверу
2) Клиент не может получить ответ в течение периода ожидания
3) Запрос был "остановлен (отменен)" Клиентом.
Но эти три причины не стандартизированы
У меня есть java script ajax client и nodejs express server
Клиентский код выглядит следующим образом:
...
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 минут борьбы, чтобы понять это.
Надеюсь, что этот пост помогает кому-то.
Желаем удачи.
При тайм-ауте в режиме ожидания статус будет равен нулю при обратном вызове.
.error( function( data,status,headers,config){
console.log(status)
}
Иногда Браузер отвечает на обработчик ошибок http с помощью объекта "Ошибка", состояние которого установлено в 0, даже если вы видите состояние ошибки 404, 401, 500 и т.д. В сети.
Это может произойти, если ваше приложение и API находятся в разных доменах - применяется механизм CORS. Согласно CORS для каждого запроса API браузер отправляет два запроса:
В Приложении мы обрабатываем ответ "Ошибка" для "Актуального/Исходного запроса", и если "запрос preflight OPTIONS" не удался - браузер не выдает правильный объект HttpError для обработчика ошибок http. Таким образом, чтобы получить правильный статус ответа http - обязательно получите предварительный запрос ответа OPTIONS.