有一个第三个你可能没见过的选项:跨源资源共享(CORS) 。
CORS标准通过添加新的HTTP标头来工作,这些标头允许服务器将资源提供给允许的原始域。浏览器支持这些标头,并遵守它们建立的限制。
示例:假设您的网站是http://my-cool-site.com,并且您在域http://third-party-site.com上拥有第三方API ,您可以通过AJAX访问该API 。
并假设您在my-cool-site.com服务器上创建的页面已向Third-party-site.com请求。通常,根据“ 相同来源安全策略”,用户浏览器将拒绝对您自己的域/子域以外的任何其他站点的AJAX呼叫。但是,如果浏览器和第三方服务器支持CORS,则会发生以下情况:
浏览器会将以下HTTP标头发送到third-party-site.com
Origin: http://my-cool-site.com
如果第三方服务器接受来自您域的请求,它将使用以下HTTP标头进行响应:
Access-Control-Allow-Origin: http://my-cool-site.com
要允许所有域,第三方服务器可以发送以下标头:
Access-Control-Allow-Origin: *
如果不允许您的站点,浏览器将抛出错误。
如果客户端具有支持CORS的相当现代的浏览器,并且您的第三方服务器也支持CORS,则可以通过对代码进行少量更改来使用它。
我在CORS上找到了一个很好的解释,在该解释上,您还会找到另一种方法:JSONP。但是JSONP将需要对您的代码进行大量更改。
要发出CORS请求,您只需XMLHttpRequest
在Firefox 3.5 +,Safari 4+和Chrome XDomainRequest
中使用IE8 +中的对象。使用XMLHttpRequest
对象时,如果浏览器发现您正在尝试进行跨域请求,它将无缝触发CORS行为。
这是一个JavaScript函数,可帮助您创建跨浏览器的CORS对象。
function createCORSRequest(method, url){
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr){
// XHR has 'withCredentials' property only if it supports CORS
xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined"){ // if IE use XDR
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
xhr = null;
}
return xhr;
}
由于您说“大多数浏览器已锁定跨域XML的使用”,所以我猜您的第三方服务器可能不支持CORS。然后,您必须找到替代方法。