Код состояния HTTP 0-что это означает для fetch или XMLHttpRequest?
Что касается кода возврата 0 для сетевых вызовов JavaScript fetch, XMLHttpRequest и MS XMLHTTP, у меня есть HTA( приложение Microsoft HTML-автономное приложение HTML + JavaScript), которое использует стандартный объект MS XMLHTTP COM (Microsoft.XMLHTTP или Msxml2.XMLHTTP в зависимости от обнаруженной версии) с помощью кода JavaScript для отправки некоторых данных обратно на сервер.
он возвращает код состояния 0. Это, по-видимому, не действительный код состояния HTTP (они должны быть три цифры в соответствии с официальная спецификация.) (Кстати, я попытался отключить сетевое соединение и получил код состояния 17003 или что-то в этом роде, что, как я думаю, из-за большого количества Google означает "поиск DNS-сервера не удался".)
Он отлично работает для меня и некоторых других людей, которые испытали ее из разных мест. Однако я отправил это клиенту, и они получили код состояния HTTP, равный нулю, а HTTP responseText пуст. Клиент попробовал его из двух мест, но оба в пределах своей корпоративной сеть.
Это HTTP-сообщение для HTTP-URL в Интернете (а не файл:// запрос, который, как я понимаю, также вернет код состояния 0 для успеха в Mozilla). Я уверен, что это код сбоя, так как он должен возвращать некоторое подтверждение как responseText, и мы не получаем данные, записанные в базе данных.
13 ответов:
Я считаю, что код ошибки указывает, что ответ был пуст, (так как даже заголовки не были возвращены). Это означает, что соединение было принято, а затем закрыто изящно (TCP FIN). Есть несколько вещей, которые могут вызвать это, но на основе вашего описания, какая-то форма брандмауэра кажется наиболее вероятным виновником.
многие ответы здесь неверны. Кажется, люди выясняют, что вызывало статус==0 в их конкретном случае, а затем обобщают это как ответ.
практически говоря, status==0 для неудачного XmlHttpRequest следует считать неопределенной ошибкой.
фактическая спецификация W3C определяет условия, для которых здесь возвращается ноль: https://fetch.spec.whatwg.org/#concept-network-error
Как вы можете видеть из спецификации (fetch или XmlHttpRequest) этот код может быть результатом ошибки, которая произошла еще до обращения к серверу.
некоторые из распространенных ситуаций, которые производят этот код состояния, отражены в других ответах, но это может быть любая или ни одна из этих проблем:
- запрос на незаконное перекрестное происхождение (см. CORS)
- блокировка брандмауэра или фильтрация
- сам запрос был отменен в коде
- установленное расширение браузера портит вещи
Что было бы полезно для браузеров, чтобы предоставить подробные отчеты об ошибках для большего количества этих сценариев 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 = неизвестно могу помочь, если вы не используете свой скрипт на сервер.
обходной путь: что мы в конечном итоге делаем
мы решили, что это связано с проблемами брандмауэра, и поэтому мы придумали обходной путь, который сделал трюк. Если у кого есть такая же проблема, вот что мы сделали:
мы по-прежнему записываем данные в текстовый файл на локальном жестком диске, как и ранее, используя HTA.
когда пользователь нажимает кнопку "отправить данные обратно на сервер", HTA считывает данные и записывает HTML-страницу это включает в себя эти данные как остров данных XML (фактически с использованием языка сценариев=блок сценариев XML).
HTA запускает ссылку на HTML-страницу в браузере.
HTML-страница теперь содержит javascript, который отправляет данные на сервер (с помощью Microsoft.XMLHTTP).
надеюсь, что это поможет любому с аналогичным требованием. В данном случае это была Флеш игра, используемая на ноутбуке на выставках. У нас никогда не было доступа ноутбук и мог только отправить его по электронной почте клиенту, поскольку эта выставка проходила в другой стране.
код ответа HTTP 0 указывает, что запрос AJAX был отменен.
Это может произойти либо из таймаута, XHR аборта или брандмауэра топать на запрос. Тайм-аут является общим, это означает, что запрос не удалось выполнить в указанные сроки. В то XHR аборт-это очень просто сделать... вы действительно можете позвонить .abort () на объекте XMLHttpRequest для отмены вызова AJAX. (это хорошая практика для одной страницы приложения, если вы не хотите AJAX звонки возврат и попытка ссылаться на объекты, которые были уничтожены.) как уже упоминалось в отмеченном ответе, брандмауэр также будет способен отменить запрос и вызвать этот ответ 0.
XHR прервать:прервать 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);
в моем случае статус стал 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>теги:<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 вернет этот код ошибки.
Я нашел новую и недокументированную причину статуса = = 0. Вот что у меня было:
XMLHttpRequest.status === 0 XMLHttpRequest.readyState === 0 XMLHttpRequest.responseText === '' XMLHttpRequest.state() === 'rejected'Это не было перекрестным происхождением, сетью или из-за отмененных запросов (по коду или по навигации пользователя). Ничего в консоли разработчика или сетевом журнале.
Я мог бы найти очень мало документации по state () (Mozilla не перечисляет его, W3C делает), и ни один из них не упомянул "отклонено".
оказывается, это был мой рекламу (uBlock Origin в Firefox).
Comments