Код статусу HTTP 0 - Помилка домену = NSURLErrorDomain?


94

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

У цій програмі я завантажую зображення з сервера.

Проблема:

Під час завантаження зображень я отримую час очікування запиту . Відповідно до документації код стану HTTP часу очікування запиту - 408.

Але в моїй програмі я отримую код стану HTTP 0із наступною помилкою

Помилка домену = NSURLErrorDomain Код = -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 , NSLocalizedDescription = Запит минув ., NSUnderlyingError = 0x13846870 "Час очікування минув."}

Під час пошуку через Інтернет я не знайшов інформації про код статусу HTTP 0.

Хтось може пояснити мені це?


1
Також може статися через змішаний вміст developer.mozilla.org/en-US/docs/Web/Security/Mixed_content
devasghar

Відповіді:


96

Немає коду стану HTTP 0. Ви бачите 0, що повертається API / бібліотекою, яку ви використовуєте. Для цього вам доведеться перевірити документацію.


7
IE10 має дивну помилку, отримуючи код стану 401 або 403, він інтерпретує його як код стану 0. У моїй голові код стану 0 є помилкою, оскільки явно щось не так.
Gaui


Відповідь неправильна. Код стану 0 існує, коли браузер не може підключитися до сервера. Коли ви отримуєте різні помилки, наприклад, 504, це спричинено зворотними налаштуваннями проксі-сервера.
Нікон

Відповідь правильна. Немає коду статусу HTTP 0. Ви можете бачити це як значення, яке повертається з API, але воно не з’являється у повідомленні відповіді HTTP.
Джуліан Решке

74

Код стану 0 в NSHTTPURLResponseоб’єкті, як правило, означає, що відповіді не було, і це може статися з різних причин. Сервер ніколи не поверне статус 0, оскільки це не дійсний код стану HTTP.

У вашому випадку ви з'являєтесь, щоб отримати код стану 0, оскільки час очікування запиту і 0 - це лише значення за замовчуванням для властивості. Сам тайм-аут може бути з різних причин, наприклад, сервер просто не реагує вчасно, блокується брандмауером або не працює все ваше мережеве з'єднання. Зазвичай у випадку останнього, хоча телефон досить розумний, щоб знати, що він не має мережевого підключення, і негайно вийде з ладу. Однак це все одно не вдасться з явним кодом стану 0.

Зверніть увагу, що у випадках, коли код стану дорівнює 0, реальна помилка фіксується у поверненому NSErrorоб'єкті, а не в NSHTTPURLResponse.

Статус HTTP 408досить рідко зустрічається в моєму досвіді. Я сам ніколи не стикався з таким. Але він, очевидно, використовується в тих випадках, коли клієнту необхідно підтримувати активне з'єднання сокета з сервером, а сервер чекає від клієнта, щоб надіслати більше даних через відкритий сокет, але це не відбувається за певний проміжок часу і сервер закінчує з’єднання 408кодом стану, по суті, повідомляючи клієнтові: "ти зайняв занадто багато часу".


1
Ідеальне пояснення.
CouchDeveloper

Це має бути прийнятим застереженням
Сайрус Дзуза,



5

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

  • можливо, ваш зв’язок реагує повільно.
  • або, можливо, внутрішній сервер недоступний.

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


Це статус API, а не статус HTTP. Якщо відповіді HTTP не було, у ньому не було коду стану HTTP.
Маркіз Лорнський

Код стану 0 не означає, що існує код відповіді HTTP, але це може бути проблемою, якщо ваш сервер недоступний.
Раві,

5

Код стану '0' може виникнути з трьох причин
1) Клієнт не може підключитися до сервера
2) Клієнт не може отримати відповідь протягом періоду очікування
3) Клієнт "зупинив (скасував)" запит .

Але ці три причини не є стандартизованими


Чи є у вас якесь джерело про це?
rgoliveira

будь-який вихідний код застосовується для тестування перших двох пунктів, вам просто потрібен запит на основі ajax. але 3-й відбувається при скасуванні запиту користувача, це можна зробити за допомогою функції скасування в jquery.
Харіпрасат Ядав,

4

Відповідь HTTP 0 не є стандартною відповіддю HTTP. Але це вказує на те, що клієнт не зміг з'єднатися з сервером і, отже, відбувся тайм-аут.


2

Ми отримали помилку:

ОТРИМАТИ 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. preflight OPTIONS запит, щоб зрозуміти, чи дозволяє API фактичний запит / запит походження.
  2. коли API дозволяє (запит OPTIOS відповідає зі статусом 204 і правильними заголовками Access-Control-Allow-Origin) - браузер надсилає наступний "Фактичний / Походження запит".

У застосунку ми обробляємо відповідь на помилку для "Фактичного запиту / Походження", і якщо "попередній запит ОПЦІЙ" не вдався - браузер не надає правильний об'єкт HttpError для обробника помилок http. Тож, щоб отримати правильний статус http-відповіді - обов’язково отримайте відповідь на запит OPTIONS до перевірки.




-1

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

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

Коди стану HTTP

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.