【问题标题】:Synchronous cross sub-domain POST request with jQuery使用 jQuery 同步跨子域 POST 请求
【发布时间】:2010-12-07 06:10:12
【问题描述】:

我正在尝试执行跨域 POST 请求,但遇到了一堵(或两堵)墙。

我无法在服务器上放置代理页面 - 所以这不是一个选项。

我研究了 getJSON,它的效果很好,只是我需要 POST 而不是 GET。

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

【问题讨论】:

    标签: javascript jquery cross-domain jsonp xss


    【解决方案1】:

    CANNOT 使用 XMLHttpRequest(又名 AJAX)发出跨域请求(GET / POST / 等)。

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

    • jQuery 从您作为参数提供的回调函数中创建一个全局可访问的函数
    • jQuery 不使用 XMLHttpRequest (AJAX) 来发出 HTTP 请求,而是动态地将 SCRIPT 标签插入到 DOM 中
    • 脚本标签的 SRC 是您尝试与之通信的请求 URL
    • jQuery 向查询字符串添加回调参数,如下所示:example.com/someurl.js?callback=someDynamicallyGeneratedMethodName
    • 然后由 SERVER 通过将 JSON 结果作为参数传递给 someDynamicallyGeneratedMethodName 来返回您的客户端可以使用的 JavaScript

    如果您无法控制要发布到的服务器,那么您就不走运了,JSONP 对您没有多大用处。服务器返回的任何内容都将在 SCRIPT 标记中,如果格式不正确,很可能会引发错误。

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

    同样,如果您无法控制要发布到的服务器,则可能需要查看代理。否则,IFRAME 可能是您唯一的其他选择。还有一种方法可以使用 SWF(闪存)对象来完成此操作。我都没有尝试过,但它们是 XMLHttpRequest 对象限制的解决方法。

    希望我能帮上忙!

    【讨论】:

    • 感谢您的解释。在那之后比一个小时的谷歌搜索要清楚得多。我可以访问我发布到的服务器,所以一切都很好。
    • Err,这条评论和主题有什么关系?它不包括 OT 特别要求的 POST!
    • @HRJ,看看 jQuery API 中的 $.ajax 函数。您可以通过设置类型变量来为您喜欢的任何类型的请求设置选项。如果你想要一个返回 JSONP 的 POST 请求,那么你可以编写代码: $.ajax({type:'POST', dataType:'jsonp', ... more options ...}) 我很抱歉没有对整个问题进行编码你最初。让我知道我是否可以进一步帮助您。 -斯蒂芬
    • 这是对的,除了这个:ha.ckers.org/blog/20090720/…
    • 这是不正确的。不可能进行 SYNCHRONOUS 跨域 JSONP 或脚本请求——只能异步(实际上,它取决于浏览器,但现在大多数都是异步的)。设置 async: false 仍然会异步运行跨域请求。
    【解决方案2】:

    您可以发帖,但您需要的是 JSONP 请求来解决跨域问题。本质上,您提供了一个回调函数,请求作为脚本内容返回,并且您的回调被请求中的 JSON 数据调用。您的服务器端脚本需要使用包裹在 JSON 对象周围的回调函数以函数调用的形式提供数据。

    请参阅post 函数的文档。

    $.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 + ");" );
    }
    

    【讨论】:

    • 供将来参考:Google Chrome 6.0.472.63 似乎不太喜欢这个。在 Safari 中,它处理返回的 JSON,但 Chrome 只显示“Access-Control-Allow-Origin 不允许 Origin null”。消息。
    【解决方案3】:

    如果您想进行跨域 POST,那么最简单的解决方案是 Matteo 提供的here。 它对我很有用

    【讨论】:

      猜你喜欢
      • 2011-06-30
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 2011-11-30
      • 2011-04-06
      相关资源
      最近更新 更多