Что это означает, когда HTTP-запрос возвращает код состояния 0?

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

Это, похоже, не является допустимым кодом статуса HTTP, так как другие коды имеют три цифры в спецификации HTTP.

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

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

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

Ответ 1

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

Ответ 2

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

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

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

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

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

  • Запрос на незаконный перекрестный поиск (см. CORS)
  • Брандмауэр-блок или фильтрация
  • Сам запрос был отменен в коде
  • Устанавливаемое расширение браузера не работает.

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

Ответ 3

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

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

Ответ 4

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 = 0 и статус XMLHttpRequestText = неизвестно может помочь вам, если вы не используете свой script на веб-сервере.

Ответ 5

Обходное решение: что мы закончили делать

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

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

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

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

  • Страница HTML теперь содержит javascript, который отправляет данные на сервер (используя Microsoft.XMLHTTP).

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

Ответ 6

Код ответа 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 будет "ошибкой" при прерывании и "таймаутом", когда произойдет таймаут.

jQuery: error(jqXHR, textStatus, errorThrown);
Zepto:  error(xhr, errorType, error);

Ответ 7

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

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

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

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

Ответ 8

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

Ответ 9

В моем случае это произошло потому, что браузер AJAX блокировался браузером из-за политики того же самого происхождения. Это была наименее ожидаемая вещь, потому что все мои HTML файлы и скрипты служили от 127.0.0.1. Как их можно считать разным происхождением?

В любом случае основной причиной был невинно выглядящий тег <base>:

<base href='<%=request.getScheme()%>://<%=request.getServerName() + ":" + request.getServerPort() + request.getContextPath()%>/'/>

Я удалил тег <base>, который мне не нужен, и теперь он отлично работает!

Ответ 10

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

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

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

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

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

Ответ 11

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

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

Например:

NetworkError: произошла сетевая ошибка.

Ответ 12

В случае, если кто-либо сталкивается с этой проблемой, это давало мне проблемы из-за запроса AJAX и отправки обычного запроса формы. Я решил это со следующей строкой:

<form onsubmit="submitfunc(); return false;">

Ключ есть return false, что заставляет форму не отправлять. Вы также можете просто вернуть false изнутри submitfunc(), но я нахожу его явно более четким.

Ответ 13

Следует отметить, что загрузка файла ajax, превышающая директиву client_max_body_size для nginx, вернет этот код ошибки.

Ответ 14

Если вы тестируете на локальном ПК, он не будет работать. Чтобы протестировать пример Ajax, вам нужно разместить файлы HTML на веб-сервере.

Ответ 15

В моем случае ошибка произошла на странице, запрошенной по протоколу HTTP, с Javascript внутри, которая пыталась сделать HTTPS-запрос. И наоборот.

После загрузки страницы нажмите F12 (или Ctrl + U) и посмотрите HTML-код вашей страницы. Если вы видите что-то подобное в своем коде:

<!-- javascript request inside the page -->
<script>
var ajaxurl = "https://example.com/wp-admin/admin-ajax.php";
(...)
</script>

И ваша страница была запрошена следующим образом:

http://example.com/example-page/2019/09/13/my-post/#elf_l1_Lw

Вы наверняка столкнетесь с этой ошибкой.

Чтобы это исправить, установите протокол запроса Javascript равным протоколу запроса страницы.

Эта ситуация, связанная с различными протоколами для запросов страниц и js, упоминалась ранее в ответе Брэд Паркс, но, я думаю, метод диагностики, представленный здесь, проще для большинства пользователей.