it-swarm-ru.tech

Статус XMLHttpRequest (responseText пуст)

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

 xmlhttp = new XMLHttpRequest (); 
 xmlhttp.open ("GET", "http://www.w3schools.com/XML/cd_catalog.xml", true); 
 xmlhttp.onreadystatechange = function () 
 {
 если (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 
 Контент-длина: 4742 

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

87
arigasa

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

38
Abhishek_8

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

Если вы занимаетесь разработкой 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, но я еще не играл с ними.

26
Slammer

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

25
dyuan

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

Access-Control-Allow-Origin: *

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

16
Alex Robinson

Также рассмотрим время ожидания request:

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

9
Andrea Savojardo

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

6
Ivan

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

3
Jarekczek

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

3
Reyan

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

2
Tomi Aarnio

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

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

Access-Control-Allow-Origin: *

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

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

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

1
Mike Beaton

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

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

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

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

1
ericsoco

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

0
Anja

Чтобы увидеть, в чем проблема, когда вы получаете загадочную ошибку 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.

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

0
Maya

Моя проблема, похожая на это, была решена путем проверки моего 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 patch. Спасибо этому кому-то.

0
Siva Tumma

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

0
Tim McConnell

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

0
Vad

У меня была та же проблема (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>

и для файла public/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);
   });
 });
0
RMDev

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

0
Massimo Roscio