Пустой ответный текст из XMLHttpRequest - PullRequest
27 голосов
/ 21 декабря 2009

Я написал 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);
        }
     }
  }

Код работает нормально. Я могу пройти и получить readyState == 4 и статус == 200, но текст responseText всегда пуст.

Я получаю ошибку в журнале (в отладке Safari) ошибки диспетчеризации: getProperties, на которую я не могу найти ссылку

Я запустил код в Safari и Firefox как локально, так и на удаленном сервере.

URL при вводе в браузер вернет строку и даст код состояния 200.

Я написал похожий код для того же URL в виджете Mac, который работает нормально, но тот же код в браузере никогда не возвращает результат.

Ответы [ 5 ]

26 голосов
/ 21 декабря 2009

Является ли http://api.xxx.com/ частью вашего домена? Если нет, то вы заблокированы той же политикой происхождения .

Возможно, вы захотите проверить следующую публикацию переполнения стека для нескольких возможных обходных путей:

12 голосов
/ 14 апреля 2010

РЕШЕНА ПРОБЛЕМА

В моем случае проблема заключалась в том, что я выполняю вызов ajax (с методами $ .ajax, $ .get или $ .getJSON из jQuery) с полным путем в параметре url:

url: "http://mydomain.com/site/cgi-bin/serverApp.php"

Но правильный способ - передать значение 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 AND .... удалить любой тег BASE в файле index.html

base href = "http://mydomain.com/" <--- плохая идея, удалите ее! </p>

Если вы не удалите его, эта версия браузера для этой системы может принять ваш запрос ajax, как если бы это был межсайтовый запрос!

У меня та же проблема, но только на компьютере Mac OS. Проблема в том, что Firefox обрабатывает ответ ajax как «межсайтовый» вызов, на любом другом компьютере / браузере он работает нормально. Я не нашел никакой помощи по этому поводу (я думаю, что это проблема реализации Firefox), но я собираюсь доказать следующий код на стороне сервера:

header('Content-type: application/json');

, чтобы гарантировать, что браузер получит данные как "данные json" ...

4 голосов
/ 21 декабря 2009

Браузер не позволяет использовать межсайтовый скриптинг.

Если URL находится за пределами вашего домена, то вам нужно сделать это на стороне сервера или переместить его в свой домен.

1 голос
/ 11 ноября 2011

Возможно, это не лучший способ сделать это. Но это как-то сработало для меня, так что я собираюсь бежать с этим.

В моей функции php, которая возвращает данные, за одну строку до строки возврата я добавляю оператор echo, повторяющий данные, которые я хочу отправить.

Теперь уверен, почему это сработало, но это сработало.

0 голосов
/ 24 января 2012

У вас была похожая проблема с вашей. Нам нужно было использовать найденное здесь решение document.domain:

Пути обхода политики одного и того же происхождения

Нам также нужно было изменить это на стороне веб-службы. Использовал заголовок «Access-Control-Allow-Origin», найденный здесь:

https://developer.mozilla.org/En/HTTP_access_control

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