Как выполнить межсайтовый запрос ajax?



Браузеры не разрешают межсайтовые вызовы AJAX (это ограничение безопасности).
Есть ли какое-то возможное решение ?



Править



Я контролирую только сайт вызывающего абонента

827   3  

3 ответов:

Если вы контролируете обе стороны, то есть много вариантов. Например, JSONP или изменение заголовка ответов удаленного веб-сайта. К сожалению, JSONP работает только в том случае, если его поддерживает удаленный веб-сайт. Вы не можете принудительно вызвать JSONP на веб-сайт, который еще не поддерживает его.

Однако, как вы уже сказали, вы контролируете только исходный веб-сайт. Вы не можете взломать браузер вокруг этого ограничения по понятным причинам. У вас есть третий вариант, который создает серверный прокси-сервер . Для создания прокси можно использовать Apache и mod_rewrite. Вот на как это сделать или эту ссылку, которая более детальна.

Например

ProxyPass /api/gtalkbots http://gtalkbots.com/reverse-proxy-data.php  
ProxyPassReverse /api/gtalkbots http://gtalkbots.com/reverse-proxy-data.php  

Создает прокси-сервер в /api/gtalkbots, который будет возвращать отдых от gtalkbots.com

Лучшее решение-использовать вызовыJSONP .

 function jsonp(url, params, callback){
  var script = document.createElement("script");
  script.setAttribute("src", url+'?'+params+'&callback='+callback);
  script.setAttribute("type","text/javascript");
  document.body.appendChild(script);
 }

 function doit(data){
  alert(data);
 }

jsonp('http://domain.com', 'foo=bar', 'doit');

На противоположной стороне веб-сайт, с которым вы связываетесь, должен иметь возможность возвращать ответ в формате JSONP, чтобы это работало.

Есть 2 способа сделать это, в зависимости от того, отправит ли вызываемый абонент JSONP или нет:

1. Если вы можете, используйте JSONP

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

Чтобы это сработало, вызываемый объект должен вернуть JSONP.

Обычный JSON выглядит так:

{a: 12, b: 15}

JSONP выглядит так это:

callback({a: 12, b: 15});

Когда запрос AJAX завершится, функция обратного вызова (которую вы определяете в своем собственном коде) будет выполнена, и данные JSON будут переданы ей как объект, таким образом, минуя междоменную политику.

2. Если JSONP не поддерживается, зеркально отразите запрос через свой собственный сервер

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

Поскольку запрос AJAX теперь сделан на ваш собственный сервер, вы не будете нарушать междоменную политику.

У этого подхода есть два недостатка:

  1. теперь требуются два запроса, которые немного замедлят время отклика, хотя, вероятно, не так много, поскольку связь между серверами, вероятно, будет осуществляться через толстую трубу.
  2. поскольку все запросы теперь исходят от вашего сервера, у вас могут возникнуть проблемы с ограничениями скорости на основе IP. Так обстоит дело с Вызовы API Twitter. Вы можете смягчить это, кэшируя результаты.

Comments

    Ничего не найдено.