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 支持。
在您配置 success
和 error
处理程序的同一个哈希中,添加一个对象,如下所示:
dataType: "jsonp"
这会将 jsonp 选项传递给 JQuery 的 ajax 处理程序,并且自动获得 JSONP 支持来检索模型/集合。
【讨论】:
不幸的是,这仅适用于 GET 请求,而不是问题所建议的完整的 RESTful API。以上是关于JSONP 和 Backbone.js的主要内容,如果未能解决你的问题,请参考以下文章