我发誓我曾经看过一篇关于此事的文章但却找不到......
如何在另一个域上执行POST类型的jQuery ajax请求?必须在没有代理的情况下完成。这可能吗?
答案 0 :(得分:9)
是的,你可以发布你想要的所有内容,即使$.post()
有效......但你不会得到回复。
这样可行,其他域将获取POST:
$.post("http://othersite.com/somePage.php", { thing: "value" }, function(data) {
//data will always be null
});
但由于same-origin policy,上面示例中的回复data
将为空。
答案 1 :(得分:3)
我尝试过的所有选项:
1)PORK:http://www.schizofreend.nl/Pork.Iframe/Examples/创建一个iframe并在那里提交帖子,然后读取响应。仍需要相同的基域
请求(即www.foo.com可以请求
来自www2.foo.com的数据,但不是来自
www.google.com)。还需要你
摆弄document.domain
财产,这会导致不利的一面
效果。并且在所有主流浏览器中存在一个普遍存在的问题,即如果动态编写任何iframe,则重新加载页面基本上会对页面上所有iframe的缓存内容进行洗牌。您的回复数据会显示在广告所在的框中。
2)flxhr:http://flxhr.flensed.com/甚至可以用来掩盖jQuery的内置ajax,所以你甚至都没有注意到它。虽然需要闪存,所以iPhone出局了
3)jsonp:如果您发布了大量数据,则无效。嘘声。
4)chunked jsonp:当你的jsonp请求太大时,将查询字符串分解为可管理的块并发送多个get请求。在服务器上重建它们。这很有用,但如果您在服务器之间对用户进行负载平衡,则会出现故障。
5)CORS:http://www.w3.org/TR/cors/在旧浏览器(IE7,IE6,Firefox 2等)中不起作用
所以我们目前采用以下算法:
花一个下午写下来,你就可以好好利用它了。将CORS添加到我们的算法可能有助于更快的iPhone支持。
答案 2 :(得分:2)
如果您可以控制在其他域上运行的代码,只需让它在响应中返回适当的Access-Control-Allow-Origin
标头。另请参阅HTTP Access-Control
at MDC。
答案 3 :(得分:0)
如果您想要点火并忘记POST而不关心响应,那么只需将表单提交给隐藏的iframe即可。这需要Transitional Doctype。
<form method="POST" action="http://example.com/" target="name_of_iframe">
如果要解析响应,则使用代理(如果是唯一的实际选项)。
如果您绝望,并控制远程网站,那么您可以:
这种方法受竞赛条件影响,而且通常很难看。通过当前域推进数据是一种更多更好的方法。
答案 4 :(得分:0)
如果您需要知道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 */
}
}
});
如果提交时出现问题,则response.statusText
应该等于"error"
。
注意:某些远程服务器将发送HTTP标头Access-Control-Allow-Origin: *
,这将导致200 OK
HTTP状态代码响应。在这种情况下,ajax将执行success
处理程序,并且不需要此方法。要查看响应,请执行console.log(JSON.stringify(response));
或使用FireBug的“网络”面板。