Javascript 提交跨域ajax POST请求
我发誓我曾经看过一篇关于这方面的文章,但是找不到Javascript 提交跨域ajax POST请求,javascript,jquery,Javascript,Jquery,我发誓我曾经看过一篇关于这方面的文章,但是找不到 如何在另一个域上执行POST类型的jQuery ajax请求?必须在没有代理的情况下完成。这可能吗?是的,你可以发布你想要的所有内容,甚至可以工作……但你不会得到回复 如果成功,其他域将获得帖子: $.post("http://othersite.com/somePage.php", { thing: "value" }, function(data) { //data will always be null }); 但是,在上面的示例中,
如何在另一个域上执行POST类型的jQuery ajax请求?必须在没有代理的情况下完成。这可能吗?是的,你可以发布你想要的所有内容,甚至可以工作……但你不会得到回复 如果成功,其他域将获得帖子:
$.post("http://othersite.com/somePage.php", { thing: "value" }, function(data) {
//data will always be null
});
但是,在上面的示例中,响应,
data
,将由于以下原因而为空。如果您希望在不关心响应的情况下发布一个fire and forget POST,则只需向隐藏的iframe提交一个表单即可。这需要一个过渡Doctype
<form method="POST" action="http://example.com/" target="name_of_iframe">
如果您想解析响应,那么使用代理是唯一的实际选择
如果您绝望地控制远程站点,那么您可以:
这种方法受竞争条件的影响,通常很难看。通过当前域代理数据是一种更好的方法。如果您可以控制其他域上运行的代码,只需让它在响应中返回一个适当的
访问控制允许源
头。另请参阅。所有我尝试过的选项:
1) PORK:创建一个iframe并在那里提交帖子,然后读取响应。每个仍需要相同的基本域
请求(即www.foo.com可以请求
数据来自www2.foo.com,但不是来自
www.google.com)。也要求你
摆弄文档.域
财产,这会造成不利的一面
影响。在所有主流浏览器中都存在一个普遍的问题,重新加载页面基本上会洗牌页面上所有iframe的缓存内容(如果其中任何一个是动态写入的)。您的回复数据将显示在广告应该出现的框中
2) flxhr:甚至可以用来屏蔽jQuery的内置ajax,这样您就不会注意到它了。不过需要flash,所以iPhone已经过时了
3) jsonp:如果你发布了大量数据,那么它就不起作用。嘘
4) 分块jsonp:当您的jsonp请求太大时,将查询字符串分成可管理的块,并发送多个get请求。在服务器上重建它们。这很有帮助,但如果您在服务器之间平衡用户负载,则会出现故障
5) CORS:在较旧的浏览器(IE7、IE6、Firefox2等)中不起作用
因此,我们目前采用以下算法:
- 如果请求足够小,请使用JSONP
- 如果不够小,但用户有闪存,请使用FlXHR
- 否则使用分块JSONP
花一个下午把它写下来,你就能永远用它了。将CORS添加到我们的算法中可能有助于更快地支持iPhone。如果您需要知道POST成功,并且无法控制远程服务器:
$.ajax({
type:"POST",
url:"http://www.somesite.com/submit",
data:'firstname=test&lastname=person&email=test@test.com',
complete: function(response){
if(response.status == 0 && response.statusText == "success")
{
/* CORS POST was successful */
}
else
{
/* Show error message */
}
}
});
如果提交有问题,则响应.statusText
应等于“error”
注意:一些远程服务器将发送HTTP头
访问控制允许源:
,这将导致200 OK
HTTP状态代码响应。在这种情况下,ajax将执行success
处理程序,而不需要此方法。要查看响应,只需执行console.log(JSON.stringify(response))
或使用FireBug的“Net”面板。@David@Nick true,我收回我的评论:)尽管不需要这样做,但任何jQuery POST-ing AJAX函数都可以更简单地完成同样的任务。这些函数只是生成iframe的高级包装器。了解库在做什么总是很有用的,这样你就可以理解它的局限性并在出现问题时加以处理。@David-他们根本不使用
,他们使用的是XmlHttpRequest()
,帖子没有被阻止,唯一得到回应的是。@David-我真的很好奇,jQuery下面做什么的
想法是从哪里来的,有没有一篇文章这样说,或者一些文档给人留下了这样的印象?看看这个。我还记得向iframe添加一个onload函数的功能,它可以与父对象进行对话以给出内容。从未尝试过。目前ACAO对浏览器的支持相当有限。我不想在野外使用它。@David:OP只是问,如果没有代理,它是否可能。我刚刚回答了这个问题。专栏作家发誓说他看到了一篇文章。我想象它是关于访问控制标题的。无论如何,浏览器支持几乎存在于所有小于1年的现代浏览器/更新中。另外,如果我使用$.post,请求是否会显示在firebug中?我现在正在尝试,但没有看到任何东西。@Louis-请求是,响应不是,它反映了您的代码将看到什么…由于SOP,响应是空的。@Louis-顺便说一句,您发送了什么?这是一个GET能处理的事情吗?因为您可以通过一个JSONP请求在GET请求上传递额外的参数…一个您可以看到的响应。另一个域名必须支持这一点。很抱歉延迟回复你,我做了一些测试,似乎无法让它工作。Javascript将执行post,但不发送任何字段。我在这里上传了一个简单的示例,说明了我是如何做到这一点的:。我还可以补充一点,请求没有出现在firebug中,但我得到了它(该页面会给我发电子邮件)。@NickCraver这可能是一篇旧文章,但这不意味着如果可以将帖子请求发送到服务器,即使你不能发送,CSRF也是可能的吗