Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.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 使用jQuery同步跨子域POST请求_Javascript_Jquery_Cross Domain_Jsonp_Xss - Fatal编程技术网

Javascript 使用jQuery同步跨子域POST请求

Javascript 使用jQuery同步跨子域POST请求,javascript,jquery,cross-domain,jsonp,xss,Javascript,Jquery,Cross Domain,Jsonp,Xss,我试图做一个跨域的POST请求,但遇到了一个(或两个)障碍 我无法在服务器上放置代理页-因此这不是一个选项 我已经研究过getJSON,它非常有效,只是我需要发布而不是获取 有可能这样做吗?如果不是,请有人向我解释getJSON是如何工作的,以及为什么我不能做一个POST替代方案。你可以做一个POST,但你想要的是一个JSONP请求来绕过跨域问题。实际上,您提供了一个回调函数,请求作为脚本内容返回,您的回调将使用来自请求的JSON数据进行调用。服务器端脚本需要使用围绕JSON对象的回调函数作为函

我试图做一个跨域的POST请求,但遇到了一个(或两个)障碍

我无法在服务器上放置代理页-因此这不是一个选项

我已经研究过getJSON,它非常有效,只是我需要发布而不是获取


有可能这样做吗?如果不是,请有人向我解释getJSON是如何工作的,以及为什么我不能做一个POST替代方案。

你可以做一个POST,但你想要的是一个JSONP请求来绕过跨域问题。实际上,您提供了一个回调函数,请求作为脚本内容返回,您的回调将使用来自请求的JSON数据进行调用。服务器端脚本需要使用围绕JSON对象的回调函数作为函数调用返回数据

请参阅有关该函数的文档

$.post( '/example.com/controller/action?callback=?',
        { param: "data" }, 
        function(data) {
             ...do something with the data...
        }, 'jsonp' );
ASP.NET MVC对此的操作:

[AcceptVerbs( HttpVerbs.Post )]
public ActionResult Action( string param, string callback )
{
     var jsonData = ...do something and construct some data in JSON...

     return Content( callback + "(" + jsonData + ");" );
}
使用XMLHttpRequest(又名AJAX)进行跨域请求(GET/POST/etc)

当服务器支持它时,您可以做的是发出JSONP请求。JSONP请求的工作方式如下:

  • jQuery从作为参数提供的回调函数中创建一个全局可访问的函数
  • jQuery不使用XMLHttpRequest(AJAX)发出HTTP请求,而是动态地将脚本标记插入DOM中
  • 脚本标记的SRC是您试图与之通信的请求URL
  • jQuery将回调参数添加到查询字符串中,如下所示:example.com/someurl.js?callback=someDynamicallyGeneratedMethodName
  • 然后由服务器返回JavaScript,客户机可以通过将JSON结果作为参数传递给someDynamicallyGeneratedMethodName来使用JavaScript
如果您无法控制要发布到的服务器,那么您就不走运了,JSONP不会给您带来多大好处。服务器返回的任何内容都将在脚本标记中,如果格式不正确,则极有可能抛出错误

有关这方面的更多信息,我建议您查看base$.ajax函数,而不是快捷方式。(在Ajax下的jQuery文档中。抱歉,我不能发布更多链接)

同样,如果您无法控制要发布到的服务器,则可能需要查看代理。否则,IFRAME可能是您唯一的其他选项。还有一种方法可以通过SWF(flash)对象实现这一点。这两种方法我都没有尝试过,但它们是XMLHttpRequest对象限制的变通方法


希望我能帮忙

如果您想跨域发布,那么最简单的解决方案是Matteo提供的解决方案。
这对我很有用

谢谢你的解释。这比一小时的谷歌搜索要清晰得多。我可以访问我发布到的服务器,所以一切正常。呃,这个评论与主题有什么关系?它不包括OT特别要求的帖子@HRJ,看看jQueryAPI中的$.ajax函数。通过设置type变量,可以为任何类型的请求设置选项。如果您希望POST请求返回JSONP,那么您需要编写代码:$.ajax({type:'POST',dataType:'JSONP',…more options…}),很抱歉没有在一开始为您编写完整的问题代码。如果我能进一步帮助你,请告诉我-斯蒂芬斯是对的,除了这一点:这是不正确的。同步跨域JSONP或脚本请求是不可能的——只是异步的(实际上,它依赖于浏览器,但现在大多数都是异步的)。设置async:false仍将异步运行跨域请求。供将来参考:Google Chrome 6.0.472.63似乎不太喜欢这样。在Safari中,它处理返回的JSON,但Chrome只显示“访问控制不允许原始值为null的Allow Origin.”消息。