如果您不介意,我将先澄清一些措辞。REST本身并不是一种协议,它只是使用HTTP协议的一种方式。我希望您会看到,REST风格对API尤其有用。当API符合该样式时,就称为“
RESTful”。如果您使用的API不是RESTful,则必须对Backbone.sync进行很多更改才能使其正常工作。希望如此!:)
HTTP协议
我喜欢示例,因此这是一个HTTP请求,用于获取此页面的HTML:
GET /questions/18504235/understand-backbone-js-rest-calls HTTP/1.1Host: stackoverflow.com
[可选]如果您曾经玩过命令行或终端,请尝试运行上面的命令
telnet stackoverflow.com80并粘贴,然后按Enter两次。瞧!HTML的全部荣耀。
在这个例子中…
GET
是 方法 。/questions/18504235/understand-backbone-js-rest-calls
是 路 。HTTP/1.1
是 协议 。Host: stackoverflow.com
是 标头的 一个例子。
您的浏览器执行的操作大致相同,只是带有更多的标题,以获取此页面的HTML。酷吧?
由于您是在前端工作的,因此您可能已经多次查看过表单标签。这是一个例子:
<form action="/login" method="post"> <input type="text" name="username" /> <input type="password" name="password" /> <input type="submit" name="submit" value="Log In" /></form>
当您提交此表单以及适当的数据时,浏览器将发送如下请求:
POST /login HTTP/1.1Host: stackoverflow.comusername=testndtv&password=zachrabbitisawesome123&submit=Log%20In
上一个示例与该示例之间存在三个差异。
- 现在的 方法
POST
。 - 该 路径 现在
/login
。 - 还有一条额外的线,称为 主体 。
虽然有一堆的其他方法,在RESTful应用程序所使用的那些是
POST,
GET,
PUT,和
DELETE。这告诉服务器应该对数据采取何种类型的操作,而不必为所有操作都使用不同的路径。
回骨干
因此,希望您现在对HTTP的工作原理有所了解。但这与骨干网有什么关系?让我们找出答案!
这是您可以在Backbone应用程序中找到的一小段代码。
var BookModel = Backbone.Model.extend({ urlRoot: '/books'});var BookCollection = Backbone.Collection.extend({ model: BookModel , url: '/books'});建立(POST)
由于我们使用的是RESTful
API,因此,这就是Backbone能够创建,读取,更新和删除我们所有图书信息的所有信息!让我们从制作一本新书开始。以下代码就足够了:
var brandNewBook = new BookModel({ title: '1984', author: 'George Orwel' });brandNewBook.save();Backbone意识到您正在尝试 创建 一本新书,并且从提供的信息中知道可以提出以下请求:
POST /books HTTP/1.1Host: example.com{"title":"1984","author":"George Orwel"}读取(获取)
看到那有多么容易?但是我们想在某个时候找回这些信息。假设我们跑了
new BookCollection().fetch()。骨干会明白,你想 读
一个 收集 的书籍,并会提出以下要求:
GET /books HTTP/1.1Host: example.com
BAM。这么简单 但是说我们只想要一本书的信息。假设是第42书。说我们跑了
new BookModel({ id: 42}).fetch()。主干看到你想 读 一个 单一的 书:GET /books/42 HTTP/1.1Host: example.com
更新(PUT)
哦,该死,我才意识到我把奥威尔先生的名字拼错了。容易修复!
brandNewBook.set('author', 'George Orwell');brandNewBook.save();Backbone足够聪明,可以知道尽管被称为
brandNewBook,但已经保存了。因此,它 更新 了这本书:
PUT /books/84 HTTP/1.1Host: example.com{"title":"1984","author":"George Orwell"}删除(删除)
最终,您意识到政府正在跟踪您的一举一动,并且您需要掩盖自己读过1984年的事实。也许为时已晚,但是尝试使用它不会造成任何伤害。因此,您运行
brandNewBook.destroy(),并且Backbone
DELETE /books/84 HTTP/1.1Host: example.com
它不见了。
其他有用的花絮
虽然我们已经讨论了很多要发送到服务器的内容,但我们可能还应该看看返回的内容。让我们回到我们的藏书中。如果您还记得的话,我们向发出了
GET请求
/books。从理论上讲,我们应该找回这样的东西:
[ {"id":42,"author":"Douglas Adams","title":"The Hitchhiker's Guide to the Galaxy"} , {"id":3,"author":"J. R. R. Tolkien","title":"The Lord of the Rings: The Fellowship of the Ring"}]没什么太可怕的。更好的是,Backbone知道如何开箱即用。但是,如果我们稍作改动会怎样?它不是
id标识字段,而是
bookId?
[ {"bookId":42,"author":"Douglas Adams","title":"The Hitchhiker's Guide to the Galaxy"} , {"bookId":3,"author":"J. R. R. Tolkien","title":"The Lord of the Rings: The Fellowship of the Ring"}]Backbone知道每个API都有点不同,这样做是可以的。您所要做的就是让它知道
idAttribute,例如:
var BookModel = Backbone.Model.extend({ urlRoot: '/books' , idAttribute: 'bookId'});您只需要将该信息添加到模型中,因为无论如何该集合都会检查模型。这样,Backbone就能理解您的API! 即使我不…
缺点是您必须记住
bookId在某些情况下使用。例如,以前我们曾经用来
new BookModel({ id: 42}).fetch()加载一本书的数据,现在我们必须使用new BookModel({ bookId: 42 }).fetch()。希望您已经找到了此回复有帮助的信息,并且不会太沉闷。我意识到,对于许多人来说,HTTP协议和RESTful体系结构并不是最令人振奋的主题,因此我尝试了一下。我可能会后悔当我稍后阅读所有这些内容时,但是今天是凌晨2点,所以我还是要继续提交此内容。



