【发布时间】:2011-09-29 14:20:50
【问题描述】:
我正在使用一个脚本,该脚本似乎使用Ext.Ajax.request(使用 ExtJS 3)来发送跨域请求 - 其中一些是 POST 请求。正在考虑从 ExtJS3 移开(一般可能从 ExtJS 移开),但快速尝试使用 XMLHttpRequest 没有奏效;我怎样才能知道使用什么技术来发送这些跨域请求?
【问题讨论】:
标签: ajax cross-domain extjs3
我正在使用一个脚本,该脚本似乎使用Ext.Ajax.request(使用 ExtJS 3)来发送跨域请求 - 其中一些是 POST 请求。正在考虑从 ExtJS3 移开(一般可能从 ExtJS 移开),但快速尝试使用 XMLHttpRequest 没有奏效;我怎样才能知道使用什么技术来发送这些跨域请求?
【问题讨论】:
标签: ajax cross-domain extjs3
我目前正在使用 ExtJS 3.3.1,我还没有切换到 4,但很可能会在新项目出现时。无需查看 Ext 源代码,我可以告诉您他们正在使用 JSONP 来完成此任务,这是进行跨域 AJAX 调用的唯一方法,因为 JavaScript 必须遵守 same-origin policy。
您是否正在尝试对 JSONP 进行纯 JS 实现?还是您已经在使用 JS 库?
编辑
根据我们的 cmets... 他们正在发出 POST 请求。 JSONP 无法做到这一点。据我所知,他们正在使用 iframe 类似的诡计。这与在旧浏览器上用于“AJAX”上传文件的技巧相同。
This 链接更详细地解释了它。
此外,Valum's file uploader 中使用了相同的方法(iframe 到、POST、上传文件)。它比 ExtJS 源代码更容易理解。
【讨论】:
Ext.Ajax.request;它更多的是关于表单提交。不过,我会看看。
Ext JS 3.4 online documentation 将为您提供Ext.Ajax 类继承模型,可用于跟踪与Ext.Ajax.request 方法调用相关的源代码。但是,与其花费更多的时间和资源来重新创建轮子,我建议通过 proxy 配置选项将原生 Ext JS Ext.data.ScriptTagProxy 类实现到您现有的商店中,以方便您的跨域请求远程商店。下面是我所指内容的缩略示例。
示例
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']
});
添加
因为您打算不再使用 Ext JS,请查看 ACD (AJAX Cross Domain) 库。
【讨论】:
Ext.Ajax 类继承模型及其底层request 方法逻辑。通过从那里开始并理解继承层次结构,您应该能够轻松地向上遍历树,识别和查看超类方法和负责促进跨域请求的逻辑。我的示例可能被误解了,但旨在暗示特定的 Ext.data.ScriptTagProxy 类,您可能会在其中找到所需的内容。
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。
【讨论】:
你可以尝试使用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']);
【讨论】: