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を機能させるには、Backbone.syncに多くの変更を加える必要があります。うまくいけばそうです! :)
私は例が好きなので、このページのHTMLを取得するHTTPリクエストを次に示します。
GET /questions/18504235/understand-backbone-js-rest-calls HTTP/1.1
Host: stackoverflow.com
[オプション]コマンドラインまたはターミナルでプレイしたことがある場合は、コマンドtelnet stackoverflow.com 80
を実行して上記の貼り付けを行い、Enterキーを数回押してください。出来上がり!すべてが栄光に満ちたHTML。
この例では...
GET
はmethodです。/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
前の例とこの例には3つの違いがあります。
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'
});
RESTful APIを使用しているため、Backboneがすべての書籍情報を作成、読み取り、更新、削除できるようにするために必要なすべての情報です!新しい本を作ることから始めましょう。次のコードで十分です。
var brandNewBook = new BookModel({ title: '1984', author: 'George Orwel' });
brandNewBook.save();
Backboneは、あなたがcreate新しい本をしようとしていることに気付き、与えられた情報から次のリクエストを行うことを知っています。
POST /books HTTP/1.1
Host: example.com
{"title":"1984","author":"George Orwel"}
それがどれほど簡単でしたか?しかし、ある時点でその情報を取り戻したいです。 new BookCollection().fetch()
を実行したとしましょう。 Backboneは、あなたがread a collectionの本をしようとしていることを理解し、次のリクエストを行います:
GET /books HTTP/1.1
Host: example.com
バム。簡単です。しかし、1冊の本の情報だけが必要だったとしましょう。本#42としましょう。 new BookModel({ id: 42 }).fetch()
を実行したとします。バックボーンは、あなたがしようとしているのを見ますread a single book:
GET /books/42 HTTP/1.1
Host: example.com
ああ、オーウェル氏の名前のスペルを間違えたのに気付いた。簡単に修正できます!
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を実行します 感覚的になり、あなたの危険を認識します deletes次のリクエストのある本:
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()
を使用して1つの書籍に関するデータをロードした場合、new BookModel({ bookId: 42 }).fetch()
を使用する必要があります。
この応答が有益であり、あまりにも退屈ではないことを願っています。多くの人にとって、HTTPプロトコルとRESTfulアーキテクチャは最も爽快なテーマではないことに気づいたので、少しスパイスを効かせようとしました。後ほどこれをすべて読んだときに後悔するかもしれませんが、ここは午前2時なので、とにかくこれを提出します。
Ajax呼び出し( '/ collection'へのPOST、GETなど)を理解していると仮定します。
バックボーンは同期を使用して、一部のモデルおよびコレクションメソッドをREST呼び出しにルーティングします。
model/collection.fetch() => GET
model.save() => POST (isNew())
model.save() => PUT (!isNew())
model.destroy() => DELETE
collection.create()
はmodel.save() (isNew()) => POST
を呼び出します
使用するURL(/ collection)をモデル/コレクションに渡すと、Backboneが呼び出しを処理します。