我正在使用一个似乎使用Ext.Ajax.request
(使用ExtJS 3)发送跨域请求的脚本 - 其中一些是POST请求。正在考虑摆脱ExtJS3(一般可能远离ExtJS),但使用XMLHttpRequest
的快速尝试不起作用;如何找出用于发送这些跨域请求的技术?
答案 0 :(得分:3)
我目前正在使用ExtJS 3.3.1,我还没有切换到4,但很可能在新项目出现时。在不查看Ext源代码的情况下,我可以告诉您他们正在使用JSONP来完成此任务,这是进行跨域AJAX调用的唯一方法,因为JavaScript必须遵守same-origin policy。< / p>
您是否尝试执行JSONP的纯JS实现?或者您已经在使用JS库了吗?
修改强>
根据我们的评论......他们正在发出POST请求。 JSONP无法做到这一点。据我所知,他们正在使用iframe
类似的技巧。这与旧版浏览器上“AJAX”上传文件的技巧相同。
This链接更详细地解释了它。
此外,Valum's file uploader中使用了相同的方法(iframe,POST,上传文件)。然后更容易遵循ExtJS源。
答案 1 :(得分:0)
Ext JS 3.4 online documentation将为您提供Ext.Ajax
类继承模型,该模型可用于跟踪与Ext.Ajax.request
方法调用相关的源代码。但是,我建议不要花费更多时间和资源重新创建轮子,而是建议通过Ext.data.ScriptTagProxy
配置选项将原生Ext JS proxy
类实现到预先存在的商店中,以方便您的交叉-domain请求远程存储。以下是我所指的缩写示例。
示例强>
var myJsonStore = new Ext.data.JsonStore
({
autoLoad : true,
proxy : new Ext.data.ScriptTagProxy
({
url : 'http://www.cross-domain.com/file.php'
}),
fields : ['myIdColumn','myCharColumn','myDateColumn']
});
<强> ADDITION 强>
因为您打算不再使用Ext JS,请查看ACD (AJAX Cross Domain)库。
答案 2 :(得分:0)
JSONP有点像黑客,但可用。
但是,如果您控制正在跨越的域,请考虑使用CORS。 CORS涉及在网站的回复中放置一个标题(Access-Control-Allow-Origin):http://enable-cors.org/
IE 8+(带有警告,natch),Firefox和WebKit浏览器支持它。 IE警告是这样的:IE对CORS请求使用不同的请求对象(XDomainRequest)。如果你必须支持Opera,你需要使用JSONP或polyfill(类似https://github.com/gimite/web-socket-js/,需要Flash)。
如果您不控制相关域名,可以尝试让他们支持CORS。
答案 3 :(得分:-2)
您可以尝试使用jsonp Jquery示例:
$.ajax({
url: "test.php",
dataType: "jsonp"
success: function(data){
console.log(data)
}
});
或者,如果您有权访问所请求的内容,则可以设置Access-Control-Allow-Origin标头。 PHP示例:
header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']);