【发布时间】:2010-10-06 22:14:05
【问题描述】:
我发誓我曾经看过一篇关于此的文章,但找不到...
如何在另一个域上执行 POST 类型的 jQuery ajax 请求?必须在没有代理的情况下完成。这可能吗?
【问题讨论】:
-
@David @Nick true,我撤回我的评论 :)
标签: javascript jquery
我发誓我曾经看过一篇关于此的文章,但找不到...
如何在另一个域上执行 POST 类型的 jQuery ajax 请求?必须在没有代理的情况下完成。这可能吗?
【问题讨论】:
标签: javascript jquery
是的,您可以发布任何您想要的内容,即使 $.post() 有效……但您不会得到回复。
这行得通,其他域将获得 POST:
$.post("http://othersite.com/somePage.php", { thing: "value" }, function(data) {
//data will always be null
});
但由于same-origin policy,上述示例中的data 响应将为空。
【讨论】:
我尝试过的所有选项:
1) PORK: http://www.schizofreend.nl/Pork.Iframe/Examples/ 创建一个 iframe 并在那里提交帖子,然后读取响应。每个仍然需要相同的基域
请求(即 www.foo.com 可以请求
来自 www2.foo.com 的数据,但不是来自
www.google.com)。还需要你
摆弄document.domain
财产,这导致不利的一面
效果。在所有主要浏览器中都存在一个普遍的问题,如果其中任何一个是动态写入的,那么重新加载页面基本上会打乱页面上所有 iframe 的缓存内容。您的响应数据将显示在广告应该出现的框中。
2) flxhr: http://flxhr.flensed.com/ 甚至可以用来屏蔽 jQuery 的内置 ajax,所以你甚至不会注意到它。不过需要闪光灯,所以 iPhone 已经过时了
3) jsonp:如果您要发布大量数据,则不起作用。嘘。
4) 分块 jsonp:当你的 jsonp 请求太大时,将查询字符串分成可管理的块并发送多个 get 请求。在服务器上重建它们。这很有帮助,但如果您在服务器之间对用户进行负载平衡,则会出现问题。
5) CORS:http://www.w3.org/TR/cors/ 不适用于旧版浏览器(IE7、IE6、Firefox 2 等)
所以我们目前做如下算法:
花一下午时间把它写下来,你就可以好好使用它了。将 CORS 添加到我们的算法中可能有助于更快地支持 iPhone。
【讨论】:
如果您可以控制在其他域中运行的代码,只需让它在响应中返回适当的 Access-Control-Allow-Origin 标头即可。另见HTTP Access-Control at MDC。
【讨论】:
Access-Control 标题。无论如何,浏览器支持存在于几乎所有小于 1 年的现代浏览器/更新中。
如果您想要火而忘记了您不关心响应的 POST,那么只需将表单提交到隐藏的 iframe。这需要一个过渡文档类型。
<form method="POST" action="http://example.com/" target="name_of_iframe">
如果你想解析响应,那么使用代理是唯一真正的选择。
如果您绝望,并且控制了远程站点,那么您可以:
这种方法会受到竞争条件的影响,而且通常很难看。通过当前域代理数据是一种非常更好的方法。
【讨论】:
<iframe>,他们使用的是XmlHttpRequest(),POST 没有被阻止,只有得到响应。
<iframe> 的想法是从哪里来的,是否有文章说这个,或者一些文档给人留下了这样的印象?
如果您需要知道 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 的“网络”面板。
【讨论】: