Междоменный вызов Ajax

Я знаю о Ajax междоменную политику. Таким образом, я не могу только назвать "http://www.google.com" по ajax Запросу HTTP и отобразить результаты где-нибудь на моем сайте.

Я попробовал его типом данных "jsonp", который на самом деле будет работать, но я получаю синтаксическую ошибку (очевидно, потому что полученные данные не являются форматированным JSON),

Там возможность состоит в том, чтобы получить/отобразить данные из чужого домена? iFrames следуют за той же политикой?

65
задан jAndy 1 November 2015 в 15:25
поделиться

7 ответов

Единственный (простой) способ получить междоменные данные с помощью AJAX - использовать язык на стороне сервера в качестве прокси, как отметил Andy E. Вот небольшой пример того, как это реализовать, используя jQuery:

Часть jQuery:

$.ajax({
    url: 'proxy.php',
    type: 'POST',
    data: {
        address: 'http://www.google.com'
    },
    success: function(response) {
        // response now contains full HTML of google.com
    }
});

И PHP (proxy.php):

echo file_get_contents($_POST['address']);

Все просто. Просто помните о том, что вы можете или не можете делать с полученными данными.

66
ответ дан 24 November 2019 в 15:24
поделиться

К сожалению (или к счастью) нет. Междоменная политика существует не просто так, если бы ее можно было легко обойти, то она была бы не очень эффективной мерой безопасности. Кроме JSONP, единственным вариантом является проксирование страниц с помощью собственного сервера.

При использовании iframe на них распространяется та же политика. Конечно, вы можете отображать данные с внешнего домена, вы просто не можете ими манипулировать.

11
ответ дан 24 November 2019 в 15:24
поделиться

JSONP - лучший вариант, на мой взгляд. Попробуйте выяснить, почему вы получаете синтаксическую ошибку - уверены ли вы, что полученные данные не являются JSON? Тогда, возможно, вы как-то неправильно используете API.

Другой способ, который вы могли бы использовать, но я не думаю, что он применим в вашем случае, это иметь iFrame на странице, src которой находится в домене, который вы хотите вызвать. Пусть он выполняет вызовы за вас, а затем использует JS для связи между iFrame и страницей. Это позволит обойти кросс-домен, но только если src iFrame находится в домене, который вы хотите вызвать.

2
ответ дан 24 November 2019 в 15:24
поделиться

Вам нужно будет динамически вставить тег скрипта на страницу, которая ссылается на данные. Используя JSONP, вы можете выполнить некоторую функцию обратного вызова после загрузки скрипта.

На странице википедии на JSONP есть краткий пример; тег сценария:

<script type="text/javascript" src="http://domain1.com/getjson?jsonp=parseResponse">
</script>

вернет данные JSON, заключенные в вызов parseResponse :

parseResponse({"Name": "Cheeso", "Rank": 7})

(в зависимости от конфигурации сценария getjson на domain1.com)

Код для динамической вставки тега будет примерно таким:

var s = document.createElement("script");
s.src = "http://domain1.com/getjson?jsonp=parseResponse";
s.type = "text/javascript";
document.appendChild(s);
19
ответ дан 24 November 2019 в 15:24
поделиться

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

if($.browser.mozilla)
   netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');

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

Это работает для браузеров Mozilla, в IE <8 пользователь должен разрешить междоменный вызов аналогичным образом, некоторая версия должна быть настроена в параметрах браузера.

chrome / safari: Пока я не нашел флага конфигурации для этих браузеров.

было бы неплохо использовать JSONP в качестве типа данных, но в моем случае я не знаю, поддерживает ли домен, для доступа к которому мне нужен , данные в этом формате.

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

4
ответ дан 24 November 2019 в 15:24
поделиться

Я столкнулся с той же проблемой в течение 2 дней, и я нашел решение, и после долгих поисков в Интернете оно оказалось элегантным. Мне нужен xss Ajax для некоторых клиентов виджетов, которые перетаскивают поток данных с веб-сайтов уровней в мое приложение Rails. вот как я это сделал.

-3
ответ дан 24 November 2019 в 15:24
поделиться

Я использую этот код для междоменного ajax-вызова, надеюсь, он поможет многим здесь. Я использую библиотеку Prototype, и вы можете сделать то же самое с JQuery, Dojo или чем-то еще:

Шаг 1: создайте новый файл js и поместите внутрь этот класс, я назвал его xss_ajax.js

var WSAjax = Class.create ({
    initialize: function (_url, _callback){
        this.url = _url ;
        this.callback = _callback ;
        this.connect () ;
    },
    connect: function (){
        var script_id = null;
        var script = document.createElement('script');
        script.setAttribute('type', 'text/javascript');
        script.setAttribute('src', this.url);
        script.setAttribute('id', 'xss_ajax_script');

        script_id = document.getElementById('xss_ajax_script');
        if(script_id){
            document.getElementsByTagName('head')[0].removeChild(script_id);
        }

        // Insert <script> into DOM
        document.getElementsByTagName('head')[0].appendChild(script);
    },
    process: function (data){
        this.callback(data) ;
    }

}) ;

Этот класс создает динамический элемент сценария, атрибуты src которого нацелены на вашего поставщика данных JSON (фактически JSON-P, поскольку ваш удаленный сервер должен предоставлять данные в этом формате :: call_back_function(//json_data_here) :: поэтому, когда тег скрипта будет создан, ваш JSON будет напрямую оценивается как функция (мы поговорим о передаче имени метода обратного вызова на сервер на шаге 2), основная концепция этого заключается в том, что скрипты, подобные элементам img, не затрагиваются ограничениями SOP.

Шаг 2: на любой html-странице где вы хотите получить JSON асинхронно (мы называем это AJAJ ~ асинхронный JAvascript + JSON :-) вместо AJAX, который использует объект XHTTPRequest), сделайте, как показано ниже

//load Prototype first
//load the file you've created in step1


var xss_crawler = new WSAjax (
     "http://your_json_data_provider_url?callback=xss_crawler.process"
 ,   function (_data){
            // your json data is _data and do whatever you like with it 
        }) ;

Вы помните обратный вызов на шаге 1? поэтому мы передаем его на сервер, и он возвращает JSON, встроенный в этот метод, поэтому в нашем случае сервер вернет анализируемый код javascript xss_crawler.process(//the_json_data), помните, что xss_crawler является экземпляром класса WSAjax. Код сервера зависит от вас (если он ваш), но большинство поставщиков данных Ajax позволяют указать метод обратного вызова в параметрах, как это сделали мы. В Ruby on rails я только что сделал

render :json=>MyModel.all(:limit=>10), :callback => params[:callback],:content_type => "application/json"

и все, теперь вы можете извлекать данные из другого домена из своих приложений (виджеты, карты и т.д.), только в формате JSON, не забудьте.

Надеюсь, это было полезно, спасибо за ваше терпение :-), мир и извините за форматирование кода, он не работает

4
ответ дан 24 November 2019 в 15:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: