Вчера по долгу службы пришлось разбираться с кросс-доменными ajax-запросами. Суть проблемы была в следующем: мне нужно было, чтобы мой скрипт отправлял с нескольких сайтов запросы на один сервер, собирающий некоторые данные. Политика безопасности браузеров запрещает это делать через обычный XHTTPRequest.
Погуглив и проведя ряд экспериментов у меня получилось вот что.
Примечание: Ниже я приведу готовое решение. А для желающих обрести теоретическую подкованность, предлагаю к прочтению:
- «Обмен данными для документов с разных доменов»,
- «Remote JSON — JSONP»,
- «JSONP: JSON With Padding»
- и применительно к jQuery статья «jQuery и Ajax: запросы»
Итак, для отправки запросов я воспользуюсь библиотекой jQuery. С версии 1.2 эта библиотека поддерживает JSONP нативно. Вот, собственно сам код для выполнения запроса:
$.getJSON("http://server.ru/logger.php?callback=?", function(data){
// тут обрабатываем полученные данные
});
Обратите внимание на параметр «callback=?» в адресе, на который отправляется запрос. Вместо вопроса jquery подставит название callback-функции. Эта callback-функция будет вызвана при получении ответа от сервера. Учтем это в серверной части.
<?php
echo $_GET['callback']."({param1:'value',param2:0});";
?>
Т.е. выход скрипта должен генерировать не просто JSON, а вызов callback-функции и передачей ей параметров, которые нужно передать от сервера клиенту.
Вот, собственно и вся премудрость. Если возникнут вопросы, задавайте в комментариях, я постараюсь на них ответить
Метки: ajax, java-script, jQuery




(9 голосов, средний: 3.67 из 5)
не работает в IE6 из-за ошибки в библиотеке jQuery
А версия библиотеки какая?
Спасибо, а IE6 идет лесом пусть ;-))
А у меня возникает ошибка «invalid label», причем использование функции eval проблему не решает...
Эм... а поподробней?
На своем одном сайте мне необходимо получить данные с другого.
Код следующий:
test.php
Но при получении ответа возникает ошибка: Firebug пишет 'Invalid Label'. и потом мою json-строку.
Причем это происходит только если посылать запрос на другой домен (используя '?callback=?') ,
Если test.php использовть на этом же домене (т.е. $.getJSON ('test.php', function (json) {...}) ошибки не возникает.
Чтоб прочистить json -данные использовала функцию eval:
var response = eval ( '(' + json + ')' );
$(«div#result»).html (response.qwer);
но это не дало никакого результата.
А если в test.php написать следующее:
Тогда возникает ошибка : «missing ; before statement» — потому что дальше выводится строка jsonp137773236376{"qwer":"test_json_respons"}
Прошу прощения, поторопился немного.
Вот правильный вариант:
Спасибо! так работает нормельно)
Но это для тестирования...
а на практике мне требуется отправить запрос на другой сайт, от которого данные приходят в формате json, т.е. могу ли я на своем сайте уже обработать готовый json-ответ? т.е. непосредственно не правя ничего в test.php?
Видимо тут без скрипта-прокси не обойтись, т.к. политика безопастности запрещает запросы на «чужие» домены. Если есть возможность модифицировать ответ сайта-источника или у него есть поддержка JSONP, то можно воспользоваться JSONP. Иначе придется данные получать скриптом на сервере, а затем отдавать клиенту Вашего сайта.
На своем одном сайте мне необходимо получить данные с другого.
Но при получении ответа возникает ошибка: Firebug пишет 'Invalid Label'. и потом мою json-строку.
Причем это происходит только если посылать запрос на другой домен (используя '?callback=?') ,
Если test.php использовть на этом же домене (т.е. $.getJSON ('test.php', function (json) {...}) ошибки не возникает.
Чтоб прочистить json -данные пробовала использовать функцию eval:
var response = eval ( '(' + json + ')' );
$(«div#result»).html (response.qwer);
но это не дало никакого результата.
версия jQuery? содержимое test.php? кусок кода, посылающий jsonp-запрос? где посмотреть?