Что это значит, когда HTTP-запрос возвращает код состояния 0? - PullRequest
102 голосов
/ 16 мая 2009

Что это означает, когда сетевые вызовы JavaScript, такие как fetch или XMLHttpRequest, или любой другой тип сетевого запроса HTTP, не работают с кодом состояния HTTP 0?

Похоже, это недопустимый код состояния HTTP, так как остальные коды в спецификации HTTP состоят из трех цифр.

Я попытался полностью отключить сеть в качестве теста. Это может быть не связано, но это привело к коду состояния 17003 (IIRC), который при быстром поиске означает «Сбой поиска DNS-сервера».

Один и тот же код отлично работает в некоторых местах и ​​системах, однако в определенных средах происходит сбой с кодом состояния 0 и не предоставляется responseText.

Это типичный HTTP-запрос POST к URL-адресу в Интернете. Он не включает file: // который, как я понимаю, может возвращать 0, указывая на успех в Firefox.

Ответы [ 13 ]

157 голосов
/ 24 января 2013

Многие из ответов здесь неправильны. Кажется, люди выясняют, что вызвало статус == 0 в их конкретном случае, а затем обобщают это как ответ.

Практически говоря, состояние == 0 для неудавшегося XmlHttpRequest следует считать неопределенной ошибкой.

Фактическая спецификация W3C определяет условия, для которых здесь возвращается ноль: https://fetch.spec.whatwg.org/#concept-network-error

Как видно из спецификации (fetch или XmlHttpRequest), этот код может быть результатом ошибки, произошедшей еще до того, как сервер подключился.

Некоторые из распространенных ситуаций, порождающих этот код состояния, отражены в других ответах, но это может быть любая из этих проблем или ни одна из них:

  1. Недопустимый запрос перекрестного происхождения (см. CORS )
  2. Брандмауэр блокирует или фильтрует
  3. Сам запрос был отменен в коде
  4. Установленное расширение браузера портит все

Было бы полезно, чтобы браузеры предоставляли подробные отчеты об ошибках для большего количества этих состояний == 0 сценариев. Действительно, иногда статус == 0 сопровождает полезное консольное сообщение, но в других нет другой информации.

47 голосов
/ 25 мая 2009

Я полагаю, что код ошибки указывает на то, что ответ был пустым (поскольку даже заголовки не были возвращены). Это означает, что соединение было принято, а затем изящно закрыто (TCP FIN). Существует ряд причин, которые могут вызвать это, но исходя из вашего описания, некоторая форма брандмауэра кажется наиболее вероятным виновником.

34 голосов
/ 18 октября 2010

Для чего стоит, в зависимости от браузера, вызовы AJAX на основе jQuery будут вызывать ваш успешный обратный вызов с кодом состояния HTTP 0. Мы обнаружили, что код состояния «0» обычно означает, что пользователь перешел на другая страница до завершения вызова AJAX.

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

13 голосов
/ 25 мая 2009

wininet.dll возвращает как стандартные, так и нестандартные коды состояния, перечисленные ниже.

401 - Unauthorized file
403 - Forbidden file
404 - File Not Found
500 - some inclusion or functions may missed
200 - Completed

12002 - Server timeout
12029,12030, 12031 - dropped connections (either web server or DB server)
12152 - Connection closed by server.
13030 - StatusText properties are unavailable, and a query attempt throws an exception

Для кода состояния «ноль» вы пытаетесь сделать запрос на локальной веб-странице, запущенной на веб-сервере или без веб-сервера?

XMLHttpRequest status = 0 и XMLHttpRequest statusText = unknown может помочь вам, если вы не запускаете свой скрипт на веб-сервере.

6 голосов
/ 27 мая 2009

Обходной путь: что мы в итоге сделали

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

  1. Мы по-прежнему записываем данные в текстовый файл на локальном жестком диске, как и ранее, используя HTA.

  2. Когда пользователь нажимает кнопку «отправить данные обратно на сервер», HTA считывает данные и записывает HTML-страницу, которая включает эти данные в качестве острова данных XML (фактически используя блок сценария SCRIPT LANGUAGE = XML) .

  3. HTA запускает ссылку на HTML-страницу в браузере.

  4. HTML-страница теперь содержит JavaScript, который отправляет данные на сервер (с использованием Microsoft.XMLHTTP).

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

4 голосов
/ 13 сентября 2012

Код ответа HTTP 0 указывает, что запрос AJAX был отменен.

Это может произойти либо из-за тайм-аута, аборта XHR или топания брандмауэра по запросу. Тайм-аут является обычным, это означает, что запрос не удалось выполнить в течение указанного времени. Аборт XHR сделать очень просто ... вы можете вызвать .abort () для объекта XMLHttpRequest, чтобы отменить вызов AJAX. ( Это хорошая практика для одностраничного приложения, если вы не хотите, чтобы вызовы AJAX возвращались и пытались ссылаться на объекты, которые были уничтожены. ) Как упоминалось в помеченном ответе, брандмауэр также мог бы отменить запрос и вызвать 0 ответ.

XHR Abort: Прервать Ajax-запросы, используя jQuery

var xhr = $.ajax({
    type: "POST",
    url: "some.php",
    data: "name=John&location=Boston",
    success: function(msg){
       alert( "Data Saved: " + msg );
    }
});

//kill the request
xhr.abort()

Стоит отметить, что запуск метода .abort () для объекта XHR также вызовет обратный вызов ошибки. Если вы выполняете какой-либо вид обработки ошибок, который анализирует эти объекты, вы быстро заметите, что прерванный XHR и тайм-аут XHR идентичны, но с jQuery textStatus, который передается обратному вызову ошибки, при прерывании будет «прерываться» и происходит «тайм-аут» с тайм-аутом. Если вы используете Zepto (очень похожий на jQuery), errorType будет «error» при прерывании и «timeout» при возникновении тайм-аута.

jQuery: error(jqXHR, textStatus, errorThrown);
Zepto:  error(xhr, errorType, error);
2 голосов
/ 03 августа 2016

Как указано в этом ответе на этой странице , код состояния 0 означает, что запрос по какой-то причине не выполнен, и библиотека javascript интерпретировала ошибку как код состояния 0.

Чтобы проверить это, вы можете выполнить одно из следующих действий:

1) Используйте это расширение chrome, Requestly , чтобы перенаправить ваш URL из https версии вашего URL в http версию, так как это приведет к ошибке безопасности смешанного контента и в конечном итоге приведет код состояния 0. Преимущество этого подхода заключается в том, что вам вообще не нужно менять приложение, и вы можете просто «переписать» свой URL, используя это расширение.

2) Измените код вашего приложения, чтобы при желании перенаправить конечную точку на версию http вашего URL вместо версии https (или наоборот). Если вы сделаете это, запрос не будет выполнен с кодом состояния 0.

2 голосов
/ 05 августа 2013

В моем случае статус стал 0, когда я забуду поставить WWW перед моим доменом. Поскольку все мои ajax-запросы были жестко запрограммированы http: /WWW.mydomain.com, а загруженная веб-страница была бы просто http://mydomain.com, это стало проблемой безопасности, поскольку это другой домен. В итоге я сделал редирект в своем файле .htaccess, чтобы всегда ставить перед www.

1 голос
/ 30 марта 2018

В дополнение к ответу Ли вы можете найти больше информации о реальной причине, переключившись на синхронные запросы, поскольку вы также получите исключение:

function request(url) {
    var request = new XMLHttpRequest();
    try {
        request.open('GET', url, false);
        request.send(null);
    } catch (e) {
        console.log(url + ': ' + e);
    }
}

Например:

NetworkError: Произошла ошибка сети.

1 голос
/ 18 октября 2017

Я нашел новую и недокументированную причину статуса == 0. Вот что у меня было:

XMLHttpRequest.status === 0
XMLHttpRequest.readyState === 0
XMLHttpRequest.responseText === ''
XMLHttpRequest.state() === 'rejected'

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

Я мог найти очень мало документации о состоянии () (Mozilla не перечисляет это, W3C делает), и ни один из них не упомянул "отклонено".

Оказывается, это был мой блокировщик рекламы (uBlock Origin в Firefox).

...