XMLHttpRequest status 0 (responseText пуст) - PullRequest
91 голосов
/ 15 февраля 2011

Невозможно получить данные с помощью XMLHttpRequest (статус 0 и responseText пуст):

xmlhttp=new XMLHttpRequest();
xmlhttp.open("GET","http://www.w3schools.com/XML/cd_catalog.xml", true);
xmlhttp.onreadystatechange=function() 
{
  if(xmlhttp.readyState==4)
    alert("status " + xmlhttp.status);
}
xmlhttp.send();

Предупреждает «статус 0».

Та же ситуация с запросом localhost (cd_catalog.xml сохраняется как локальный файл)

xmlhttp.open("GET","http://localhost/cd_catalog.xml", true);

Но с локальным IP-запросом

xmlhttp.open("GET","http://127.0.0.1/cd_catalog.xml", true);

и с запросом локального файла

xmlhttp.open("GET","cd_catalog.xml", true);

все в порядке (статус 200)

Что может вызвать проблему (статус = 0) с онлайн-запросом?

PS: Live HTTP Headers показывает, что все в порядке во всех 4 случаях:

  HTTP/1.1 200 OK
  Content-Length: 4742

PS2: локальный веб-сервер Apache на VMWare (хост-ОС Win7, гостевая ОС Ubuntu, сетевой адаптер - NAT). Браузер - Firefox.

Ответы [ 19 ]

40 голосов
/ 16 апреля 2012

статус равен 0, когда ваш HTML-файл, содержащий скрипт, открывается в браузере через схему файлов. Убедитесь, что поместили файлы на ваш сервер (apache или tomcat), а затем откройте его по протоколу http в браузере. (т.е. http://localhost/myfile.html) Это решение.

27 голосов
/ 08 марта 2011

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

Если вы занимаетесь разработкой localhost, вы можете совершать междоменные вызовы- Я делаю это все время.

Для Firefox вы должны включить его в настройках вашей конфигурации

signed.applets.codebase_principal_support = true

Затем добавить что-то вроде этого в свой открытый код XHR:

  if (isLocalHost()){
    if (typeof(netscape) != 'undefined' && typeof(netscape.security) != 'undefined'){
      netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');
    }
  }

Для IE:если я правильно помню, все, что вам нужно сделать, это включить настройку безопасности браузера в разделе «Разное → Доступ к источникам данных через домены», чтобы он работал с ActiveX XHR.

IE8 и выше также добавили междоменные возможности к собственным объектам XmlHttpRequest, но я еще не играл с ними.

25 голосов
/ 29 декабря 2011

На самом деле убедитесь, что ваш тип кнопки - Button not Submit, что вызвало конфликт статуса, когда я недавно встречался.

17 голосов
/ 30 сентября 2011

Если сервер отвечает на метод OPTIONS и GET и POST (какой бы из них вы не использовали) с таким заголовком, как:

Access-Control-Allow-Origin: *

Это может работать нормально. Кажется в FireFox 3.5 и rekonq 0.4.0. Очевидно, с этим заголовком и первоначальным ответом на OPTIONS сервер говорит браузеру: «Идем дальше и пропустим этот междоменный запрос».

9 голосов
/ 29 июня 2016

Рассмотрим также время ожидания запроса :

Современный браузер возвращает readyState = 4 и s tatus = 0 , если до ответа сервера прошло слишком много времени.

6 голосов
/ 05 мая 2013

Добавьте setRequestHeader("Access-Control-Allow-Origin","*") к ответу вашего сервера.

3 голосов
/ 30 декабря 2017

Открыть консоль JavaScript .Там вы увидите сообщение об ошибке.В моем случае это был CORS.

3 голосов
/ 07 ноября 2011

Я столкнулся с подобной проблемой. Все было хорошо, «readystate» был 4, но «status» был 0. Это потому, что я использовал портативный сервер Apache PHP и мой файл, в котором я использовал объект «XMLHttpRequest», был html-файлом. Я изменил расширение файла на php, и проблема была решена.

2 голосов
/ 30 мая 2013

Чтобы ответить на вопрос, почему http://127.0.0.1/cd_catalog.xml работает, пока http://localhost/cd_catalog.xml нет: Firefox рассматривает 127.0.0.1 и localhost как два разных домена.

1 голос
/ 24 апреля 2015

Алекс Робинсон уже (и первый) дает правильный ответ на этот вопрос. Но, чтобы уточнить это немного больше ...

Вы должны добавить заголовок ответа HTTP:

Access-Control-Allow-Origin: *

Если вы сделаете это, результат не просто «может работать», но «будет работать».

NB. Вам нужно добавить заголовок HTTP response - так что вы можете делать это только на сервере, которым вы управляете. Никогда не будет возможности напрямую получить http://w3schools.com/XML/cd_catalog.xml с исходного URL-адреса, используя XMLHttpRequest (согласно вопросу OP), потому что этот ресурс (по крайней мере, не по состоянию на 24 апреля 2015 г.) не содержит таких CORS заголовок.

http://en.wikipedia.org/wiki/Cross-origin_resource_sharing дает больше информации.

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