Код состояния HTTP 0-что это означает для fetch или XMLHttpRequest?

Что касается кода возврата 0 для сетевых вызовов JavaScript fetch, XMLHttpRequest и MS XMLHTTP, у меня есть HTA( Microsoft HTML application-offline HTML + JavaScript application), который использует стандартный объект MS XMLHTTP COM (Microsoft.XMLHTTP или Msxml2.XMLHTTP в зависимости от обнаруженной версии) через код JavaScript для отправки некоторых данных обратно на сервер.

он возвращает код состояния 0. Это, по-видимому, не допустимый код состояния HTTP (они должны быть три цифры в соответствии с официальная спецификация.) (Кстати, я попытался отключить сетевое соединение и получил код состояния 17003 или что-то в этом роде, что, я думаю, из-за большого количества googling означает "поиск DNS-сервера не удался".)

Он отлично работает для меня и некоторых других людей, которые испытали ее из разных мест. Однако я отправил это клиенту,и они получили код состояния HTTP с нулевым значением, а http responseText пуст. Клиент попробовал это из двух мест, но оба в пределах их корпоративной сеть.

Это HTTP-сообщение для HTTP-URL в Интернете (не файл:// запрос, который, как я понимаю, также вернет код состояния 0 для успеха в Mozilla). Я уверен, что это код сбоя, поскольку он должен вернуть некоторое подтверждение как responseText, и мы не получаем данные, записанные в базе данных.

13 ответов


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


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

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

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

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

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

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

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


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

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


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


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

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

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

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

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

  4. HTML-страница теперь содержит javascript, который отправляет данные на сервер (с помощью Microsoft.Для xmlhttp).

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


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

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

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


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

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

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

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


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

в любом случае, основной причиной был невинный вид <base> tag:

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

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


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

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

например :

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


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

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

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


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


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

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

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

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

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