NETWORK_ERROR: исключение XMLHttpRequest 101
Я получаю эту ошибку
NETWORK_ERROR: исключение XMLHttpRequest 101
при попытке получить контент XML с одного сайта. Вот мой код
var xmlhttp;
if(window.XMLHttpRequest)
{
xmlhttp = new XMLHttpRequest();
}
if (xmlhttp==null)
{
alert ("Your browser does not support XMLHTTP!");
return;
}
xmlhttp.onReadyStateChange=function()
{
if(xmlhttp.readyState==4)
{
var value =xmlhttp.responseXML;
alert(value);
}
}
xmlhttp.open("GET",url,false);
xmlhttp.send();
//alert(xmlhttp.responseXML);
}
xmlhttp.open("GET",url,false);
xmlhttp.send(null);
У кого-нибудь есть решение?
7 ответов
Если url
Вы предоставляете расположен снаружи вашего сервера, и сервер не позволил вам отправлять запросы, у вас есть проблемы с разрешениями. Вы не можете получить доступ к данным с другого сервера с XMLHttpRequest
без сервера, явно позволяющего вам сделать это.
Обновление: Понимая, что это теперь видно как ответ в Google, я попытался найти документацию по этой ошибке. Это было удивительно сложно.
Эта статья, тем не менее, имеет некоторую справочную информацию и шаги, чтобы решить. В частности, здесь упоминается эта ошибка:
Пока сервер настроен на разрешение запросов от источника вашего веб-приложения, XMLHttpRequest будет работать. В противном случае выдается исключение INVALID_ACCESS_ERR.
Интерпретация INVALID_ACCESS_ERR, кажется, то, что мы смотрим здесь.
Чтобы решить эту проблему, сервер, который получает запрос, должен быть настроен на разрешение источника. Это описано более подробно в Mozilla.
Ограничение на то, что вы не можете получить доступ к данным с другого сервера с помощью XMLHttpRequest, может применяться, даже если в URL-адресе подразумевается только удаленный сервер.
Итак: url = "http://www.myserver.com/webpage.html"
может потерпеть неудачу,
но: url = "/webpage.html"
успешно - даже если запрос делается с www.myserver.com
Запрос прерван, потому что он был кэширован или ранее был запрошен? Кажется, ошибка XMLHttpRequest Exception 101 может быть вызвана по нескольким причинам. Я обнаружил, что это происходит, когда я отправляю запрос XMLHttpRequest с одним и тем же URL более одного раза. (Изменение URL-адреса путем добавления в конец URL-адреса строки, уничтожающей кэш, позволяет повторить запрос. - Я не собирался повторять запрос, но события в программе вызвали его и привели к этому исключению).
Не возвращает правильный responseText или responseXML в случае повторного запроса является ошибкой (вероятно, webKit).
Когда произошло это исключение, я получил событие onload с readyState==4 и состоянием объекта запроса =0 и responseText=="" и responseXML==null. Это был междоменный запрос, который разрешает сервер.
Это было на системе Android 2.3.5, которая использует webKit/533.1
У кого-нибудь есть документация о том, что должно означать исключение?
Нечто подобное произошло со мной, когда я вернул неправильный XML (я поместил атрибут в корневой узел). На случай, если это кому-нибудь поможет.
xmlhttp.open("GET",url, true);
установите асинхронную часть в true
Я нашел очень хорошую статью с двумя различными решениями.
- Первый, реализующий jQuery и JSONP, объясняет, насколько это просто.
- Второй подход - это перенаправление через вызов PHP. Очень просто и очень приятно.
Другим современным методом решения этой проблемы является обмен исходным кодом перекрестного происхождения. HTML5 предлагает эту функцию. Вы можете "обернуть" ваш запрос XMLhttp в этот CORS_request, и если целевой браузер поддерживает эту функцию, вы можете использовать его, и у вас не возникнет никаких проблем.
РЕДАКТИРОВАТЬ: Дополнительно я должен добавить, что есть много причин, которые могут вызвать эту проблему. Не только междоменное ограничение, но и просто неправильные настройки в вашем WEB.CONFIG вашего веб-сервиса.
Пример IIS(.NET):
Чтобы включить HTTP-доступ из внешних источников (в моем случае это скомпилированное приложение Phonegap с запросом CORS), вы должны добавить его в свой WEB.CONFIG.
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
Другой сценарий:
У меня запущены два веб-сервиса... Один на 80-м и один на 90-м. Это также дало мне ошибку HTTP-запроса XML. Я даже не знаю почему:). Тем не менее, я думаю, что это может помочь многим неопытным читателям.