AJAX跨域调用

jAn*_*ndy 65 javascript ajax jquery json jsonp

我知道AJAX跨域策略.因此,我不能仅通过ajax HTTP请求调用" http://www.google.com "并在我的网站上的某处显示结果.

我尝试使用dataType"jsonp",它实际上会工作,但我得到一个语法错误(显然因为收到的数据不是JSON格式化)

是否还有其他可能从外部域接收/显示数据?iFrame遵循相同的政策?

Tat*_*nen 66

使用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
    }
});
Run Code Online (Sandbox Code Playgroud)

和PHP(proxy.php):

echo file_get_contents($_POST['address']);
Run Code Online (Sandbox Code Playgroud)

就那么简单.请注意您对刮削数据的能力或不能做什么.

  • 并且非常清楚这样的代理是一个严重的安全漏洞...至少列出可接受的地址,不要盲目地接受任何传递的地址.看看这里一个不错的代理脚本:http://benalman.com/projects/php-simple-proxy/ (29认同)

alu*_*nny 19

您需要在引用数据的页面中动态插入脚本标记.使用JSONP,您可以在脚本加载时执行一些回调函数.

JSONP上的维基百科页面有一个简洁的例子; 脚本标签:

<script type="text/javascript" src="http://domain1.com/getjson?jsonp=parseResponse">
</script>
Run Code Online (Sandbox Code Playgroud)

将返回包含在调用中的JSON数据parseResponse:

parseResponse({"Name": "Cheeso", "Rank": 7})
Run Code Online (Sandbox Code Playgroud)

(取决于getjsondomain1.com上脚本的配置)

动态插入标记的代码如下:

var s = document.createElement("script");
s.src = "http://domain1.com/getjson?jsonp=parseResponse";
s.type = "text/javascript";
document.appendChild(s);
Run Code Online (Sandbox Code Playgroud)


小智 16

您可以使用YQL来执行请求,而无需托管您自己的代理.我做了一个简单的函数,以便更容易运行命令:

function RunYQL(command, callback){
     callback_name = "__YQL_callback_"+(new Date()).getTime();
     window[callback_name] = callback;
     a = document.createElement('script');
     a.src = "http://query.yahooapis.com/v1/public/yql?q="
             +escape(command)+"&format=json&callback="+callback_name;
     a.type = "text/javascript";
     document.getElementsByTagName("head")[0].appendChild(a);
}
Run Code Online (Sandbox Code Playgroud)

如果你有jQuery,你可以改用$ .getJSON.

样本可能是这样的:

RunYQL('select * from html where url="http://www.google.com/"',
       function(data){/* actions */}
);
Run Code Online (Sandbox Code Playgroud)


And*_*y E 11

不幸的是(或者幸运的是)没有.跨域策略是有原因的,如果它很容易解决它,那么它作为安全措施就不会非常有效.除了JSONP之外,唯一的选择是使用您自己的服务器代理页面.

使用iframe,它们受制于相同的政策.当然,您可以显示来自外部域的数据,您无法操纵它.

  • @jAndy:不,在跨不同域访问文档时,访问被阻止到99%的DOM.可以使用跨文档消息传递(使用HTML5 /现代浏览器),但必须由双方实施. (4认同)