Состояние XMLHttpRequest 0 (responseText пуст)

Невозможно получить данные с 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-адреса localhost

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 показывает, что все в порядке во всех четырех случаях:

  HTTP/1.1 200 OK
  Content-Length: 4742

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

Ответ 1

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

Ответ 2

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

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

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

signed.applets.codebase_principal_support = true

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

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

Для IE, если я правильно помню, все, что вам нужно сделать, это включить параметр безопасности браузера в разделе "Разное и rarr; доступ к источникам данных по доменам", чтобы заставить его работать с ActiveX XHR.

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

Ответ 3

Собственно, убедитесь, что ваш тип кнопки - это кнопка "Не отправлять", что вызвало конфликт состояний, с которым я недавно встречался.

Ответ 4

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

Access-Control-Allow-Origin: *

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

Ответ 5

Рассмотрим также тайм-аут запроса:

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

Ответ 6

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

Ответ 7

У меня возникла аналогичная проблема. Все было в порядке, "readistate" было 4, но "статус" равнялся 0. Это было потому, что я использовал портативный сервер Apache PHP, а мой файл, в котором я использовал объект XMLHttpRequest, был html файлом. Я изменил расширение файла на php, и проблема была решена.

Ответ 8

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

Ответ 9

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

Ответ 10

Здесь другой случай, в котором status === 0, специфичный для загрузки:

Если вы прикрепляете обработчик событий 'load' к XHR.upload, как предложенный MDN (прокрутите вниз до части загрузки "Мониторинг" прогресс '), объект XHR будет иметь status=0, а все остальные свойства будут пустыми. Если вы прикрепляете обработчик 'load' непосредственно к объекту XHR, как и при загрузке содержимого, вы должны быть в порядке (если вы не используете localhost).

Однако, если вы хотите получить хорошие данные в обработчиках событий 'progress', вам нужно привязать обработчик к XHR.upload, а не непосредственно к самому объекту XHR.

Я тестировал это до сих пор на Chrome OSX, поэтому я не уверен, какая часть проблемы представляет собой документация MDN и насколько реализована реализация Chrome...

Ответ 11

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

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

Access-Control-Allow-Origin: *

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

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

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

Ответ 12

Чтобы увидеть, в чем проблема, когда вы получаете загадочную ошибку 0, перейдите к... | Больше инструментов | Инструменты разработчика (Ctrl + Shift + I) в Chrome (на странице с сообщением об ошибке)

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

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

У меня уже было:

Access-Control-Allow-Origin: *

Но нет:

Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Authorization

в заголовке ответа моего веб-сервиса.

После того, как я добавил это, ноль моей ошибки пропал с моего собственного веб-сервера, а также при локальном запуске файла index.html без веб-сервера, но он по-прежнему выдавал ошибки в коде пера.

Вернуться к... | Больше инструментов | Инструменты разработчика пока получают сообщение об ошибке в codepen, и там четко объяснено: codepen использует https, поэтому я не могу звонить по http, так как безопасность ниже.

Поэтому мне нужно разместить мой веб-сервис на https.

Зная, как получить истинное сообщение об ошибке - бесценно!

Ответ 13

Моя проблема, подобная этой, была решена путем проверки моего html-кода. У меня был обработчик onclick в моей кнопке отправки формы методу. например: onclick="sendFalconRequestWithHeaders()". Этот метод, в свою очередь, вызывает ajax точно так же, как ваш, и делает то, что я хочу. Но не так, как ожидалось, мой браузер ничего не возвращал.

Извлечен из кто-то трудный, я вернул false в этом обработчике и решил. Позвольте мне упомянуть, что перед тем, как прибыть на этот пост, я провел целых 3-дневный уик-энд и полдня в офисе, пишущий код, реализующий CORS filters, jetty config, другие jersey and embedded jetty связанные вещи - только для того, чтобы исправить это., Вращающийся все мое понимание вокруг cross domain ajax requests и стандартов. Было смешно, как простые ошибки в javascript делают вас глупыми.

Чтобы быть правдой, я пробовал signed.applets.codebase_principal_support = true и написал isLocalHost() **if**. может быть, этот метод должен быть реализован нами, firefox говорит, что нет такого Теперь я должен очистить свой код, чтобы отправить патч git. Благодаря этому кто-то.

Ответ 14

Запрос браузера "127.0.0.1/somefile.html" не изменяется на локальный веб-сервер, а "localhost/somefile.html" может поступать как "0: 0: 0: 0: 0: 0: 0: 1/somefile.html", если поддерживается IPv6. Таким образом, последнее может обрабатываться как переход от домена к другому.

Ответ 15

Алекс Робинсон и bmju предоставили ценную информацию для понимания проблем, связанных с перекрестным происхождением. Я хотел бы добавить, что вам может понадобиться сделать явный вызов OPTIONS в коде клиента, прежде чем делать желаемый GET/POST (например, в отношении конечной точки службы CORS OAuth). Ваш браузер/библиотека не может автоматически обрабатывать запрос OPTIONS. Gruber, это один из возможных ответов на ваш вопрос.

Ответ 16

У меня была та же проблема (readyState было 4 и статус 0), затем я придерживался другого подхода, описанного в этом уроке: https://spring.io/guides/gs/consuming-rest-jquery/

Он вообще не использовал XMLHttpRequest, вместо этого использовал метод jquery $.ajax():

<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script src="hello.js"></script>
</head>

<body>
    <div>
        <p class="greeting-id">The ID is </p>
        <p class="greeting-content">The content is </p>
    </div>
</body>

и для общедоступного /hello.js файла (или вы можете вставить его в тот же HTML-код напрямую):

$(document).ready(function() 
 {
    $.ajax({
        url: "http://rest-service.guides.spring.io/greeting"
   }).then(function(data) {
      $('.greeting-id').append(data.id);
      $('.greeting-content').append(data.content);
   });
 });

Ответ 17

Я должен был добавить свой текущий IP-адрес (снова) в белый список Atlas MongoDB и поэтому избавился от ошибки статуса 0 XMLHttpRequest

Ответ 18

У меня просто была эта проблема, потому что я использовал 0.0.0.0 качестве сервера, изменил его на localhost и он работает.

Ответ 19

В случае, если вы делаете запрос xhr в цикле for, он не будет работать правильно. Следуйте этой теме, чтобы узнать, как выполнить запрос xhr в цикле for. Это сработало для меня.

XMLHttpRequest для цикла for

Ответ 20

Изменить: Пожалуйста, прочитайте комментарии Мальволио ниже, поскольку этот ответ устарел.

Вы не можете выполнять междоменные XMLHttpRequests.

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

Два других теста не работают, потому что JavaScript не может связываться с удаленным сервером через XMLHttpRequest.

Вместо этого вы можете подумать:

  • XMLHttp-запрос собственного сервера для получения вашего удаленного XML-контента для вас (например, php script)
  • Попытка использовать службу, такую ​​как GoogleAppEngine, если вы хотите сохранить ее в полном объеме.

Надеюсь, что поможет