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 теперь сделан на ваш собственный сервер, вы не будете нарушать междоменную политику.
У этого подхода есть два недостатка:
- теперь требуются два запроса, которые немного замедлят время отклика, хотя, вероятно, не так много, поскольку связь между серверами, вероятно, будет осуществляться через толстую трубу.
- поскольку все запросы теперь исходят от вашего сервера, у вас могут возникнуть проблемы с ограничениями скорости на основе IP. Так обстоит дело с Вызовы API Twitter. Вы можете смягчить это, кэшируя результаты.
Comments