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 ]

1 голос
/ 07 сентября 2018

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

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

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

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

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

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

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

0 голосов
/ 25 ноября 2013

Моя проблема, подобная этой, была решена путем проверки моего 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 голосов
/ 28 сентября 2018

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

0 голосов
/ 10 августа 2015

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

0 голосов
/ 23 ноября 2016

У меня была такая же проблема (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 голосов
/ 02 сентября 2015

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

0 голосов
/ 29 марта 2019

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

0 голосов
/ 15 февраля 2011

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

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

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

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

Вместо этого вы можете рассмотреть:

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

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

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