Коротка відповідь
Це не код відповіді HTTP, але він задокументований WhatWG як дійсне значення для атрибута статусу відповіді XMLHttpRequest
або отримання.
Взагалі кажучи, це значення за замовчуванням, яке використовується, коли немає реального коду стану HTTP для повідомлення та / або сталася помилка під час надсилання запиту або отримання відповіді. Можливі сценарії, коли це так, включають, але не обмежуючись:
- Запит ще не надіслано або скасовано.
- Браузер все ще чекає отримання статусу відповіді та заголовків.
- Під час запиту зв’язок розірвано.
- Запит минув.
- Запит зіткнувся з нескінченним циклом переспрямування.
- Браузер знає стан відповіді, але ви не маєте доступу до нього через обмеження безпеки, пов’язані з Політикою того самого походження .
Довга відповідь
По-перше, повторюємо: 0 - це не код стану HTTP. У Розділі 6.1 RFC 7231 є їх повний перелік , який не включає 0, а вступ до розділу 6 чітко зазначає, що
Елементом коду стану є трицифровий цілочисельний код
що 0 не є.
Однак 0 як значення .status
атрибута об’єкта XMLHttpRequest задокументовано, хоча відстежити всі відповідні деталі дещо складно. Ми починаємо з https://xhr.spec.whatwg.org/#the-status-attribute , документуючи .status
атрибут, який просто говорить:
status
Атрибут повинен повернути відповідь «сек статусу .
Це може звучати марно і тавтологічно, але насправді тут є інформація! Пам'ятайте, що в цій документації йдеться про .response
атрибут відповіді XMLHttpRequest
, а не відповіді, тому це говорить нам про те, що визначення статусу на об'єкті XHR відкладено на визначення статусу відповіді в специфікації "Вибрати".
Але який об'єкт відповіді? Що робити, якщо ми фактично ще не отримали відповідь? Вбудоване посилання на слово "відповідь" переводить нас на https://xhr.spec.whatwg.org/#response , де пояснюється:
Ан XMLHttpRequest
має відповідну відповідь. Якщо не вказано інше, це помилка мережі .
Отже, відповідь, статус якої ми отримуємо, за замовчуванням є помилкою мережі. І шукаючи всюди фразу "встановити відповідь на", яка використовується в специфікації XHR, ми можемо побачити, що вона встановлена в п'яти місцях:
До помилки мережі, коли:
На відповідь, отриману шляхом надсилання запиту за допомогою Fetch, або за допомогою завдання відповіді процесу Fetch (якщо запит XHR є асинхронним), або завдання кінцевого завдання відповіді процесу Fetch (якщо запит XHR синхронний).
Розглядаючи стандарт Fetch , ми можемо побачити, що:
Помилка мережі - це відповідь , статус якої завжди0
тому ми можемо негайно сказати, що ми побачимо статус 0 на об'єкті XHR у будь-якому з випадків, коли специфікація XHR говорить, що відповідь повинна бути встановлена на помилку мережі. (Цікаво, що сюди входить випадок, коли потік тіла "помиляється", що, як стверджує специфікація Fetch, може статися під час розбору тіла після отримання статусу - тому теоретично я вважаю, що об'єкт XHR може мати свій статус встановіть на 200, потім під час отримання тіла зіткнетеся з помилкою, що не вистачає пам’яті, і тому змініть його статус на 0.)
Ми також зазначаємо у стандарті Fetch, що існує кілька інших типів відповідей, статус яких визначено рівним 0, існування яких пов'язане із запитами про перехресне походження та політикою того самого походження:
Непрозора відфільтрована відповідь - це відфільтрована відповідь, чий ... статус0
...
Відфільтрована відповідь непрозорого перенаправлення - це відфільтрована відповідь , статус якої 0
...
(різні інші подробиці щодо цих двох типів відповідей опущено).
Але крім них, є також багато випадків, коли алгоритм Fetch (а не специфікація XHR, яку ми вже розглядали) вимагає від браузера повернути мережеву помилку! Дійсно, фраза "повернути помилку мережі" з'являється 40 разів у стандарті Fetch. Я не буду намагатись перерахувати всі 40 тут, але зазначу, що вони включають:
- Випадок, коли схема запиту не розпізнана (наприклад, спроба надіслати запит на madeupscheme: //foobar.com)
- Дивовижно невиразна інструкція "Якщо ви сумніваєтесь, поверніть помилку мережі". в алгоритмах обробки ftp: // та file: // URL-адрес
- Нескінченні переспрямування: "Якщо кількість запитів переспрямовує двадцять, поверніть мережеву помилку."
- Куча проблем, пов’язаних з CORS, наприклад, "Якщо забруднення відповідей httpRequest не є" cors ", а перевірка політики ресурсів перехресного джерела із заблокованими поверненнями запитів та відповідей повертає помилку мережі".
- Помилки підключення: "Якщо з’єднання не вдалося, поверніть помилку мережі."
Іншими словами: кожен раз, коли щось піде не так, інше , ніж отримати реальний HTTP код статусу помилки на кшталт 500 або 400 з сервера, ви в кінцевому підсумку з атрибутом стану 0 на вашому об'єкті XHR або Fetch об'єкт відповіді в браузері. Кількість можливих конкретних причин, перелічених у специфікації, величезна.
Нарешті: якщо вас чомусь цікавить історія специфікації, зверніть увагу, що ця відповідь була повністю переписана в 2020 році, і що вас може зацікавити попередня редакція цієї відповіді , яка проаналізувала, по суті, ті самі висновки. старіші (і набагато простіші) специфікації W3 для XHR, перш ніж вони були замінені на більш сучасні та більш складні специфікації WhatWG, на які посилається ця відповідь.