5

我正在尝试做一个跨域 POST 请求并且已经碰壁(或两个)。

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

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

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

4

3 回答 3

26

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

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

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

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

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

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

希望我能帮上忙!

于 2009-10-16T18:09:39.420 回答
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 + ");" );
}
于 2009-10-16T02:06:16.400 回答
0

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

于 2012-07-08T08:48:28.493 回答