Answers:
如果您要访问的API支持JSONP,则只需在请求中提供一个javascript函数名称,然后JSONP返回的javascript myfunc({the:data});
就可以像常规javascript一样运行,这就是为什么要创建一个新<script src="www.website.com/somecall?jsonp=myfunc">
标签来“发送请求”(如果您type: jsonp
在$.ajax
请求中使用,jQuery会自动执行此操作)。
缺点是它要求API的提供程序支持JSONP。
只要目标网站crossdomain.xml
的根目录上有一个文件允许它访问Flash ,它就可以访问跨域内容(在提供API的服务器上通常是这种情况)。
不利之处在于,它需要用户浏览器中的Flash,并且您从中获取数据的网站必须具有crossdomain.xml,以允许跨域请求。
像PHP这样的服务器端语言没有BS同域限制,因此您可以拥有一个充当代理的脚本(例如,通过诸如cURL之类的http扩展名之一下载)。
额外的好处是,您可以在将数据转发到网页/ javascript之前清理服务器上的数据(甚至是多个源的mashup),因此您甚至可以仅提取数据的有用部分,这在移动Web应用程序中非常有用带宽可能是一个问题。
缺点是所有请求都必须通过服务器,这样会增加服务器的负载。
但是好处是它可以与任何资源一起使用,因为它不需要目标支持跨域或jsonp。因此,如果没有其他效果,那就可以了。
Internet Explorer具有跨域请求
Firefox 3.5+具有跨域共享标准,但是它需要您尝试访问的资源包括特殊的标头,例如PHP:
header("content-type: Access-Control-Allow-Origin: *");
header("content-type: Access-Control-Allow-Methods: GET");
其他一些主要的浏览器也支持此功能,因此,如果您不需要支持旧的浏览器,并且可以获取尝试访问的资源以发送这些标头,那么这可能是您最好的选择,否则可能是服务器端脚本将是我的建议。
Firefox也具有用户设置capability.policy.default.XMLHttpRequest.open
,但是我不希望用户在其浏览器中更改设置。
您可以为此使用(另一个域的)API。您的Javascript将调用您的Web服务器(您的域)上的PHP文件(或其他脚本文件),该文件将调用(使用CURL的另一个域的)API,并获得响应。