使用jQuery从子域获取JSON

我有user1.mydomain.comuser2.mydomain.com域。 我使用api.mydomain.com通过AJAX / JSON处理我的Web应用程序。 因此,我想使用jquery从user1.mydomain.comapi.mydomain.com/projects发出POST请求: {'action':'getActiveProjects'}以获取JSON中user1的活动项目列表结果。 我找到了$.getJSON方法,但似乎没有选择将一些数据发送到服务器,只有GET方法。 我面临的另一个问题是同一起源政策。 那么,如何将一些JSON发布到另一个子域上的服务器并获得JSON响应呢?

通过指定dataType: "jsonp"使用$.ajax和JSON-P。 链接文档中的详细信息。 您的服务器必须使用JSON-P而不仅仅是JSON进行响应,但如果您控制服务器,这很容易做到。

或者,如果您只需要支持相当新的浏览器(而不是IE),则可以设置服务器以支持CORS 。 但这只是在最近的浏览器中支持,虽然IE8支持它,但它不支持透明通过通常的XMLHttpRequest对象,而是需要一个完全不同的传输对象( XDomainRequest ),jQuery不会自动处理(但是)。

这是使用jQuery的JSON-P示例:

 $.ajax({ // The source URL url: "http://jsbin.com/ubucu4", // Tell jQuery you're doing JSON-P dataType: "jsonp", // Include some data with the request if you like; // this example doesn't actually *use* the data data: {some: "data"}, // You can control the name of the callback, but // usually you don't want to and jQuery will handle // it for you. I have to here because I'm doing this // example on JSBin. jsonpCallback: "exampleCallback", // Success callback success: function(data) { display("Received data, typeof data = " + typeof data); display("data.foo = " + data.foo); display("data.bar = " + data.bar); }, // Error callback error: function(jxhr, status, err) { display("Error, status = " + status + ", err = " + err); } }); 

实时复制

在服务器上,你会看到jQuery已经为URL添加了一个callback参数,例如在上面它将是http://jsbin.com/ubucu4?callback=exampleCallback但是如果你喜欢jQuery控制它的名字将是有点异国情调。 您的服务器端代码应该构造一个JavaScript函数调用的响应,并调用该函数。 我在上面的例子中的回答是:

 exampleCallback({ "foo": "This is foo", "bar": "This is bar" }); 

这一切都发生了,因为JSON-P使用动态添加的script标记(这很好),而不是使用受同源策略约束的XMLHttpRequest 。 在我的例子中,标签看起来像

  

浏览器将检索脚本,这是您的JSON-P响应,并执行它。 这意味着将调用回调,并将数据提供给您的脚本。

从技术上讲,你的JSON-P响应不是JSON; 这是JavaScript,因此您必须将JSON-P与您信任的服务器(例如您自己的子域服务器)一起使用,因为您将代码直接注入页面。 否则,如果你使用的服务器是你无法信任的,那么注入的代码可能会从页面上读取信息并将其发送给某些第三方。 请注意你的口号。

您不能使用Ajax / JSON,因为子域是单个域。 但是,您可以使用JSONP 。 jQuery内置了这个,所以你只需要在你的请求中指定它。 看看相关的文档 。 您不能将POST与JSONP一起使用(这受到此技术工作方式的限制),但没有其他方法可以执行跨浏览器跨域请求。

document.domain设置为主域

 document.domain = "mydomain.com" 

更多信息在这里