Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 提交跨域ajax POST请求_Javascript_Jquery - Fatal编程技术网

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">

如果您想解析响应,那么使用代理是唯一的实际选择

如果您绝望地控制远程站点,那么您可以:

  • 提交上述表格
  • 在响应中设置cookie(在iframe可能导致cookie被视为“第三方”(即可能是广告跟踪)之前,可能会阻止该cookie)
  • 等待足够长的时间,等待响应返回
  • 动态生成src指向远程站点的脚本元素
  • 在响应中使用JSON-P,并利用以前存储在cookie中的数据

  • 这种方法受竞争条件的影响,通常很难看。通过当前域代理数据是一种更好的方法。

    如果您可以控制其他域上运行的代码,只需让它在响应中返回一个适当的
    访问控制允许源
    头。另请参阅。

    所有我尝试过的选项:

    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也是可能的吗