当前位置: 首页 > 面试题库 >

了解Backbone.js REST调用

梁渊
2023-03-14
问题内容

我正在尝试了解Backbone.js同步方法,并且正在浏览http://backbonejs.org/#Sync上的文档

它说

The default sync handler maps CRUD to REST like so:

create → POST   /collection
read → GET   /collection[/id]
update → PUT   /collection/id
delete → DELETE   /collection/id

现在,由于我一直从事前端开发并且是Backbone的新手,所以我发现上面的内容很难理解…我从未使用过REST或任何其他服务器端协议…

您能用简单的术语解释一下吗(例如当我们使用Backbone.sync时REST的映射方式)任何非常简单的示例都将非常有用…


问题答案:

如果您不介意,我将先澄清一些措辞。REST本身并不是一种协议,它只是使用HTTP协议的一种方式。我希望您会看到,REST风格对API尤其有用。当API符合该样式时,就称为“
RESTful”。如果您使用的API不是RESTful,则必须对Backbone.sync进行很多更改才能使其正常工作。希望如此!:)

HTTP协议

我喜欢示例,因此这是一个HTTP请求,用于获取此页面的HTML:

GET /questions/18504235/understand-backbone-js-rest-calls HTTP/1.1
Host: stackoverflow.com

[可选]如果您曾经玩过命令行或终端,请尝试运行上面的命令telnet stackoverflow.com 80并粘贴,然后按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.1
Host: stackoverflow.com

username=testndtv&password=zachrabbitisawesome123&submit=Log%20In

上一个示例与该示例之间存在三个差异。

  1. 现在的 方法POST
  2. 路径 现在/login
  3. 还有一条额外的线,称为 主体

虽然有一堆的其他方法,在RESTful应用程序所使用的那些是POSTGETPUT,和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.1
Host: example.com

{"title":"1984","author":"George Orwel"}

读取(获取)

看到那有多么容易?但是我们想在某个时候找回这些信息。假设我们跑了new BookCollection().fetch()。骨干会明白,你想
一个 收集 的书籍,并会提出以下要求:

GET /books HTTP/1.1
Host: example.com

BAM。这么简单 但是说我们只想要一本书的信息。假设是第42书。说我们跑了new BookModel({ id: 42 }).fetch()。主干看到你想 一个 单一的 书:

GET /books/42 HTTP/1.1
Host: example.com

更新(PUT)

哦,该死,我才意识到我把奥威尔先生的名字拼错了。容易修复!

brandNewBook.set('author', 'George Orwell');
brandNewBook.save();

Backbone足够聪明,可以知道尽管被称为brandNewBook,但已经保存了。因此,它 更新 了这本书:

PUT /books/84 HTTP/1.1
Host: example.com

{"title":"1984","author":"George Orwell"}

删除(删除)

最终,您意识到政府正在跟踪您的一举一动,并且您需要掩盖自己读过1984年的事实。也许为时已晚,但是尝试使用它不会造成任何伤害。因此,您运行brandNewBook.destroy(),并且Backbone
变得有情,并意识到您的危险 按照以下要求 删除 该书:

DELETE /books/84 HTTP/1.1
Host: 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点,所以我还是要继续提交此内容。



 类似资料:
  • 我正在尝试为ListView实现自定义cell Factory。我的应用程序基于我从另一个线程获取的这个示例。 因此,对于该列表的每一行,都将创建一个新的XCell对象,hBox将从中显示。然而,尽管有文档记录,我不理解以下事情是如何发生的: > 这很模糊,但我可以猜hBox的出现是因为ListCell。setgraphics(从标记的类继承)。 在XCell中。updateItem(字符串项,布

  • 问题内容: 我是一个长期的PHP(CodeIgniter和WordPress)开发人员,直到最近才想学习其他几种语言。我已经着手通过node.js学习Ruby(在Rails和Sinatra上),Python(在Flask框架下)和Javascript。 我决定使用每种语言创建一个我能想到的最基本的应用程序,即URL扩展器。除了node.js和Javascript,我已经设法用每种语言创建了一个工作

  • 调整颜色和色调之前的考虑事项 Photoshop 中功能强大的工具可增强、修复和校正图像中的颜色和色调(亮度、暗度和对比度)。在调整颜色和色调之前,需要考虑下面一些事项。 使用经过校准和配置的显示器。对于重要的图像编辑,校准和配置十分关键。否则,在打印后,图像在您的显示器和在其他显示器上看上去有所不同。 尝试使用调整图层来调整图像的色调范围和色彩平衡。使用调整图层,您可以返回并且可以进行连续的色调

  • 在jprofiler中,CPU视图中的时间和调用树视图中的数据库(jdbc/JPA)如何相互关联?如何判断瓶颈是在数据库调用还是在java代码中 > CPU视图的调用树部分中显示的时间是整个请求的累积时间,包括JPA和JDBC调用所花费的时间,还是只包括CPU,不包括IO时间。请求的总时间是我在CPU视图的调用树部分中看到的,还是数据库和CPU视图的调用树时间的总和 不同行的问题:我看到在java

  • 本文向大家介绍简单了解Javscript中兄弟ifream的方法调用,包括了简单了解Javscript中兄弟ifream的方法调用的使用技巧和注意事项,需要的朋友参考一下 兄弟ifream的方法调用 兄弟ifream A 兄弟ifream A 使用parent.layer.open方法打开兄弟ifream B 注:type:2 弹框加载ifream,在url后面加参数,把ifream A的id传给

  • 问题内容: 我了解将一个函数作为回调传递给另一个函数并让其执行,但是我不了解执行此操作的最佳实现。我正在寻找一个非常基本的示例,例如: 在myFirstFunction中,如果我确实返回了新的callback(),则它可以工作并执行匿名函数,但这对我来说似乎不是正确的方法。 问题答案: 你可以说 或者,如果要在回调中调整的值,则可以使用该方法。 函数内部将是任何东西。