Имеет ли код статуса HTTP 0 значение? - PullRequest
86 голосов
/ 30 сентября 2010

Похоже, что при создании XMLHttpRequest из скрипта в браузере, если браузер настроен на работу в автономном режиме или если сетевой кабель отключен, запрос завершается с ошибкой и со статусом = 0. 0 не перечислены среди допустимых кодов состояния HTTP.

Что означает код состояния 0? Означает ли это одно и то же для всех браузеров и для всех клиентских утилит HTTP? Это часть спецификации HTTP или другая спецификация протокола? Кажется, это означает, что HTTP-запрос вообще не может быть выполнен, возможно, из-за того, что адрес сервера не может быть разрешен.

Какое сообщение об ошибке уместно показать пользователю? «Либо вы не подключены к Интернету, либо веб-сайт испытывает проблемы, либо в адресе может быть ошибка ввода»?

Я должен добавить к этому, что я вижу поведение в FireFox, когда установлено «Работа в автономном режиме», но не в Microsoft Internet Explorer, если установлено «Работа в автономном режиме». В IE пользователь получает диалоговое окно с возможностью выхода в Интернет. FireFox не уведомляет пользователя перед возвратом ошибки.

Я прошу об этом в ответ на запрос "показать лучшее сообщение об ошибке". То, что делает Internet Explorer, хорошо. Он сообщает пользователю, что является причиной проблемы, и дает им возможность ее исправить. Чтобы дать эквивалентный UX с FireFox, мне нужно определить причину проблемы и сообщить пользователю. Так что же я могу сделать из статуса 0? Имеет ли он универсальное значение или ничего мне не говорит?

Ответы [ 6 ]

144 голосов
/ 19 октября 2014

Короткий ответ

Это , а не код ответа HTTP, но - это , задокументированное W3 как допустимое значение для атрибута status XMLHttpRequest (и, следовательно, также объекта jqXHR для пользователей jQuery).

Охватывает целый ряд возможных ситуаций, в которых нет реального HTTP-кода ответа, доступного для отчета, либо потому, что вы не отправилизапрос, вы явно прервали его, страница выгружается, или x произошел сбой для одного из многих возможных значений x .

Длинный ответ

Во-первых, повторить: 0 - это , а не код состояния HTTP.Полный список их приведен в RFC 7231, раздел 6.1 , который не содержит 0, и введение в раздел 6 четко гласит, что

Элемент кода состояния являетсятрехзначный целочисленный код

, который не равен 0.

Однако 0 в качестве значения атрибута status объекта XMLHttpRequest равен документированы.Из документации по http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute:

4.7.1 Атрибут состояния

Атрибут status должен возвращать результат выполнения этих шагов:

  1. Если состояние UNSENT или OPENED, вернуть 0.

  2. Если установлен флаг ошибки, вернуть 0.

  3. ВернутьКод состояния HTTP.

Мы можем углубиться в спецификацию и выяснить, что означают эти условия для возврата 0.С http://www.w3.org/TR/XMLHttpRequest/#states:

4.5 Состояния

...

UNSENT (числовое значение 0)

Объект построен.

OPENED (числовое значение 1)

Метод open() был успешно запущен.Во время этого состояния заголовки запроса могут быть установлены с помощью setRequestHeader(), а запрос может быть выполнен с использованием метода send().

...

Флаг ошибки указываеткакой-то тип ошибки сети или выборочное завершение.Первоначально он не установлен.

Также важно отметить, что следующее возможное состояние после UNSENT и OPENED равно HEADERS_RECEIVED:

HEADERS_RECEIVED (числовое значение 2)

Все перенаправления (если таковые имеются) были выполнены, и все заголовки HTTP окончательного ответа были получены.Несколько ответных членов объекта теперь доступны.

Собрав все это вместе, краткий ответ таков, что 0 - это просто то, что возвращается атрибутом status объекта XMLHttpRequest, когда естьреальный код состояния не возвращается, потому что либо:

  • Запрос еще не отправлен, либо
  • Запрос был отправлен, но заголовки ответа еще не былиполучено, или
  • Произошло одно из многих возможных обстоятельств, перечисленных в документах , которые привели к установке "флага ошибки".

Хорошо, но какие ошибки могут привести к установке этого загадочного «флага ошибки»?Если вы нажмете CTRL-F на «флаг ошибки» в документации W3, вы обнаружите, что он получает unset при отправке запроса, и он только когда-либо получает set как часть алгоритма«прекратить запрос».Просматривая все места , для которых вызывается алгоритм , вы обнаружите, что это происходит, когда:

  • Запрос открывается (или повторно открывается) с помощью метода open()
  • Запрос собирает мусор (например, при выходе со страницы)
  • Запрос прерывается с помощью метода abort()
  • Произошла «ошибка запроса»,это может произойти, когда возникает одна из следующих ситуаций:

    • Произошла сетевая ошибка, которая может произойти, если

      • Существует бесконечный цикл перенаправления
      • Есть / есть

        Ошибки DNS, сбой согласования TLS или сетевая ошибка другого типа

      • Запрос был запросом CORS, и ответ не может быть разделен
    • Произошла ошибка прерывания, которая может произойти, только если

      Конечный пользователь отменяет запрос

      что бы это ни значило. Я не знаю ни одного браузера, который бы показывал пользователям, когда выполняются запросы AJAX, и дает им возможность явно их отменять, поэтому я думаю, что этот - по крайней мере сегодня - неактуален.

    • Произошла ошибка тайм-аута, что означает, достаточно разумно, что

      timeout не равно 0, и с момента начала запроса количество миллисекунд, указанное в timeout, прошло

Что касается XMLHttpRequest, это все.

Помимо XMLHttpRequest, я бы предположил, что библиотеки HTTP на языках вне JavaScript вполне могут использовать код состояния 0 аналогично, как значение по умолчанию, когда с сервера не был получен код состояния.

52 голосов
/ 27 сентября 2012

статус 0 появляется, когда вызов ajax был отменен до получения ответа путем обновления страницы или запроса недоступного URL-адреса.

этот статус не задокументирован, но существует через вызовы ajax и makeRequest от gadget.io.

5 голосов
/ 23 января 2014

из документации http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute означает, что запрос был отменен перед отправкой куда-либо

4 голосов
/ 01 февраля 2017

Знай, что это старый пост. Но эти проблемы все еще существуют.

Вот некоторые из моих выводов по этому вопросу, грубо объясненные.

«Статус» 0 означает одну из 3 вещей в соответствии со спецификацией XMLHttpRequest:

  • Ошибка разрешения имени DNS (например, при извлечении сетевого штекера)

  • сервер не ответил (например, недоступен или не отвечает)

  • запрос был прерван из-за проблемы с CORS (аборт выполняется пользовательским агентом и выполняется после сбоя перед полетом ОПЦИИ).

Если вы хотите пойти дальше, погрузитесь глубоко во внутренности XMLHttpRequest. Я предлагаю прочитать последовательность обновления в состоянии готовности ([0,1,2,3,4] - нормальная последовательность, [0,1,4] соответствует состоянию 0, [0,1,2,4] означает отсутствие содержимого отправлено, что может быть ошибкой или нет). Вы также можете присоединить слушателей к xhr (onreadystatechange, onabort, onerror, ontimeout) для выяснения деталей.

Из спецификации ( XHR Living spec ):

const unsigned short UNSENT = 0;
const unsigned short OPENED = 1;
const unsigned short HEADERS_RECEIVED = 2;
const unsigned short LOADING = 3;
const unsigned short DONE = 4;
0 голосов
/ 27 июня 2016

Да, кое-как прервался вызов ajax. Причина может быть следующей.

  1. Перед выполнением запроса ajax пользователь перешел на другую страницу.
  2. У запроса Ajax есть время ожидания.
  3. Сервер не может вернуть ответ.
0 голосов
/ 13 мая 2016

Начиная с iOS 9, вам нужно добавить «Настройки безопасности транспорта транспорта» в файл info.plist и разрешить «Разрешать произвольные загрузки», прежде чем отправлять запрос на незащищенный веб-сервис HTTP. У меня была эта проблема в одном из моих приложений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...