JSONP 和 Backbone.js

Posted

技术标签:

【中文标题】JSONP 和 Backbone.js【英文标题】:JSONP and Backbone.js 【发布时间】:2011-11-02 09:54:45 【问题描述】:

我想将 Backbone.js 与我控制的 REST api 一起使用。我希望 REST api 和 Backbone 脚本存在于不同的域中,但不幸的是这将被阻止,因为它是一个跨域请求。

Backbone.js 是否具有支持 JSONP 请求的内置功能?或者,是否有人有任何手动将 JSONP 支持添加到 Backbone.js sync 系统的经验?

【问题讨论】:

【参考方案1】:

您将无法将整个 REST API 与 JSONP 一起使用。您只能使用 JSONP 调用 GET 请求(它的工作原理是在当前文档上编写一个新的 <script> 标签,然后调用 javascript 回调...)。

要使用所有 HTTP 动词(POST、DELETE、PUT),您可以使用 CORS 协议:http://www.w3.org/TR/access-control/。

CORS 是浏览器和网络服务之间协商的协议,它告诉浏览器“可以”从跨域调用中执行 Javascript 代码

要使用它,您只需在服务器响应中包含一些自定义标头,告诉浏览器可以接受跨域请求。这是一篇博客文章,解释了如何使用 RubyOnRails 实现它(但它应该与其他框架非常相似......):http://www.tsheffler.com/blog/?p=428

这是最简单的解决方案,您可以像在同一个域中一样使用backbone.js,并且它适用于大多数当前浏览器(Internet Explorer 8+、Firefox 3.5+、Safari 4+ 和 Chrome)!

如果您需要旧版浏览器支持,我确实设法使用 easyXDM 使主干工作:

easyXDM 是一个 Javascript 库,使您作为开发人员能够轻松解决同源策略设置的限制,从而使跨域边界的通信和公开 javascript API 变得容易。

它有点复杂,并且可以与一些众所周知的 iframe hacks 一起使用(有时用于 javascript 小部件,如 GMaps、facebook 小部件......)。

希望对您有所帮助!

【讨论】:

根据this link from microsoft,CORS支持在IE8/9中受到限制,并且不使用XMLHttpRequest,它使用XDomainRequest对象。一些亮点(不足):只能使用 GET/POST,没有自定义标头,请求内容类型将始终为 text/plain,不能随请求发送身份验证 cookie,必须都使用相同的 http 方案(例如 http 和 http,或 https &https),【参考方案2】:

可以通过fetch 的选项添加对 GET 操作的 JSONP 支持。

在您配置 successerror 处理程序的同一个哈希中,添加一个对象,如下所示:

dataType: "jsonp"

这会将 jsonp 选项传递给 JQuery 的 ajax 处理程序,并且自动获得 JSONP 支持来检索模型/集合。

【讨论】:

不幸的是,这仅适用于 GET 请求,而不是问题所建议的完整的 RESTful API。

以上是关于JSONP 和 Backbone.js的主要内容,如果未能解决你的问题,请参考以下文章

jsonp的原理和实现

json和jsonp(json是目的,jsonp是手段)

JSONP 和 ASMX 网络服务

Json和Jsonp

jsonp 请求和回传实现

说说JSON和JSONP,浅析JSONP解决AJAX跨域问题