Подтвердить что ты не робот

Код состояния 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 внеочередного запроса, NSL., NSUnderlyingError = 0x13846870 "Время ожидания истекло."}

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

Мы получили сообщение об ошибке:

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.

Ответ 9

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

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

Ответ 10

У меня есть 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 минут борьбы, чтобы понять это.
Надеюсь, что этот пост помогает кому-то.

Желаем удачи.

Ответ 11

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

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

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

Ответ 12

Иногда Браузер отвечает на обработчик ошибок http с помощью объекта "Ошибка", состояние которого установлено в 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.