Пустой ответный текст из XMLHttpRequest
Я написал XMLHttpRequest, который работает нормально, но возвращает пустой responseText.
Javascript выглядит следующим образом:
var anUrl = "http://api.xxx.com/rates/csv/rates.txt";
var myRequest = new XMLHttpRequest();
callAjax(anUrl);
function callAjax(url) {
myRequest.open("GET", url, true);
myRequest.onreadystatechange = responseAjax;
myRequest.setRequestHeader("Cache-Control", "no-cache");
myRequest.send(null);
}
function responseAjax() {
if(myRequest.readyState == 4) {
if(myRequest.status == 200) {
result = myRequest.responseText;
alert(result);
alert("we made it");
} else {
alert( " An error has occurred: " + myRequest.statusText);
}
}
}
Код работает нормально. Я могу пройти и получить готовое состояние == 4 и статус == 200, но текст ответа всегда пуст.
Я получаю сообщение об ошибке в журнале (в отладке Safari) ошибки Диспетчеризация: getProperties, на которую я не могу найти ссылку.
Я запустил код в Safari и Firefox как локально, так и на удаленном сервере.
При вводе в браузер URL вернет строку и даст код состояния 200.
Я написал аналогичный код для того же URL в виджете Mac, который работает нормально, но тот же код в браузере никогда не возвращает результат.
5 ответов
Является http://api.xxx.com/
часть вашего домена? Если нет, то вы заблокированы той же политикой происхождения.
Возможно, вы захотите проверить следующую публикацию переполнения стека для нескольких возможных обходных путей:
ПРОБЛЕМА РЕШЕНА
В моем случае проблема заключалась в том, что я выполняю вызов ajax (с методами $.ajax, $.get или $.getJSON из jQuery) с полным путем в параметре url:
Но правильный способ - передать значение url как:
url: "site / cgi-bin / serverApp.php"
Некоторые браузеры не конфликтуют и не делают различий между тем или иным текстом, но в Firefox 3.6 для Mac OS этот полный путь воспринимается как "межсайтовый скриптинг"... другое дело, в том же браузере существует различие между:
http://mydomain.com/site/index.html
И положи
http://www.mydomain.com/site/index.html
На самом деле это правильная точка зрения, но большинство реализаций не делают различий, поэтому решение состояло в том, чтобы удалить весь текст, который указывает полный путь к сценарию, в методах, которые выполняют запрос ajax И.... удалить любой тег BASE в файле index.html
base href="http://mydomain.com/" <--- плохая идея, удалите ее!
Если вы не удалите его, эта версия браузера для этой системы может принять ваш запрос ajax, как если бы это был межсайтовый запрос!
У меня та же проблема, но только на компьютере Mac OS. Проблема в том, что Firefox обрабатывает ответ ajax как "межсайтовый" вызов, на любом другом компьютере / браузере он работает нормально. Я не нашел никакой помощи по этому поводу (я думаю, что это проблема реализации Firefox), но я собираюсь доказать следующий код на стороне сервера:
header('Content-type: application/json');
чтобы браузер получал данные как "данные json"...
Браузер защищает вас от межсайтовых скриптов.
Если URL находится за пределами вашего домена, то вам нужно сделать это на стороне сервера или переместить его в свой домен.
Это может быть не лучшим способом сделать это. Но это как-то сработало для меня, так что я собираюсь бежать с этим.
В мою функцию php, которая возвращает данные, за одну строку до строки возврата, я добавляю оператор echo, повторяющий данные, которые я хочу отправить.
Теперь уверен, почему это сработало, но это сработало.
Была похожая проблема с вашей. Нам нужно было использовать найденное здесь решение document.domain:
Способы обойти политику того же происхождения
Мы также должны были изменить принципы на стороне веб-службы. Использовал заголовок "Access-Control-Allow-Origin", найденный здесь: