草庐IT

javascript - 了解 Backbone.js REST 调用

coder 2023-07-03 原文

我正在尝试了解 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 或任何其他服务器端协议(protocol)......

你能否用简单的术语解释一下(比如当我们使用 Backbone.sync 时 REST 是如何映射的)
任何非常简单的例子都会非常有用......

最佳答案

如果你不介意,我将开始清理一些措辞。 REST 本身并不是一种协议(protocol),它只是一种使用 HTTP 协议(protocol)的方式。 REST 风格对于 API 尤其有用,我希望您会看到。当 API 符合该风格时,它被称为“RESTful”。如果您使用的 API 不是 RESTful,则您必须对 Backbone.sync 进行大量更改才能使其正常工作。所以希望它是! :)

HTTP 协议(protocol)

我喜欢例子,所以这里有一个 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协议(protocol) .
  • 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
    

    上一个示例与本示例之间存在三个不同之处。
  • 方法 现在是 POST .
  • 路径 现在是 /login .
  • 还有一条额外的线路,叫做 正文 .

  • 虽然还有很多其他方法,但在 RESTful 应用程序中使用的方法是 POST , GET , PUT , 和 DELETE .这会告诉服务器它应该对数据采取什么类型的操作,而不必为所有内容设置不同的路径。

    回到主干

    所以希望现在您对 HTTP 的工作原理有了更多的了解。但这与 Backbone 有何关系?让我们一探究竟吧!

    这是您可能会在 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"}
    

    读取 (GET)

    看到那是多么容易吗?但我们想在某个时候取回这些信息。假设我们运行了 new BookCollection().fetch() . Backbone 会理解您正在尝试 阅读 收藏书籍,它会提出以下要求:
    GET /books HTTP/1.1
    Host: example.com
    

    营商事工。这么容易。但是假设我们只想要一本书的信息。假设第 42 本书。假设我们跑了 new BookModel({ id: 42 }).fetch() . Backbone 看到您正在尝试 阅读 单例书:
    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 协议(protocol)和 RESTful 架构并不是最令人振奋的主题,所以我试图给它加点趣味。当我稍后阅读所有这些时,我可能会感到遗憾,但现在是凌晨 2 点,所以无论如何我都会继续提交。

    关于javascript - 了解 Backbone.js REST 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18504235/

    有关javascript - 了解 Backbone.js REST 调用的更多相关文章

    1. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

      我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

    2. c# - 如何在 ruby​​ 中调用 C# dll? - 2

      如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

    3. java - 从 JRuby 调用 Java 类的问题 - 2

      我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

    4. ruby - 调用其他方法的 TDD 方法的正确方法 - 2

      我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent

    5. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

      在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

    6. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

      说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

    7. ruby - 如何找到调用当前方法的方法 - 2

      如何找到调用此方法的位置?defto_xml(options={})binding.pryoptions=options.to_hifoptions&&options.respond_to?(:to_h)serializable_hash(options).to_xml(options)end 最佳答案 键入caller。这将返回当前调用堆栈。文档:Kernel#caller.例子[0]%rspecspec10/16|===================================================62=====

    8. ruby-on-rails - 使用 HTTParty 的非常基本的 Rails 4.1 API 调用 - 2

      Rails相对较新。我正在尝试调用一个API,它应该向我返回一个唯一的URL。我的应用程序中捆绑了HTTParty。我已经创建了一个UniqueNumberController,并且我已经阅读了几个HTTParty指南,直到我想要什么,但也许我只是有点迷路,真的不知道该怎么做。基本上,我需要做的就是调用API,获取它返回的URL,然后将该URL插入到用户的数据库中。谁能给我指出正确的方向或与我分享一些代码? 最佳答案 假设API为JSON格式并返回如下数据:{"url":"http://example.com/unique-url"

    9. ruby - 为什么当我调用类的实例方法时,初始化不显示为方法? - 2

      我正在写一篇关于在Ruby中几乎一切都是对象的博客文章,我试图通过以下示例来展示这一点:classCoolBeansattr_accessor:beansdefinitialize@bean=[]enddefcount_beans@beans.countendend所以从类中我们可以看出它有4个方法(当然,除非我错了):它可以在创建新实例时初始化一个默认的空bean数组它可以计算它有多少个bean它可以读取它有多少个bean(通过attr_accessor)它可以向空数组写入(或添加)更多bean(也通过attr_accessor)但是,当我询问类本身它有哪些实例方法时,我没有看到默认

    10. ruby-on-rails - Rake 任务仅调用一次时执行两次 - 2

      我写了一个非常简单的rake任务来尝试找到这个问题的根源。namespace:foodotaskbar::environmentdoputs'RUNNING'endend当在控制台中执行rakefoo:bar时,输出为:RUNNINGRUNNING当我执行任何rake任务时会发生这种情况。有没有人遇到过这样的事情?编辑上面的rake任务就是写在那个.rake文件中的所有内容。这是当前正在使用的Rakefile。requireFile.expand_path('../config/application',__FILE__)OurApp::Application.load_tasks这里

    随机推荐