モデルの永続化とRESTful API – Ember.js入門(23)
ember-dataによるモデルの登録・更新・削除の続きです。
毎度書いているかと思いますが、Ember.js(emeber-data)では、サーバサイドでモデルの永続化を行うためにRESTful APIを利用することが強く推奨されています。
モデルを取得する時、すなわちDataStoreのfindメソッドを呼び出した場合、GETリクエストが行われます。 詳細はember-dataとREST APIによるモデルの永続化を参照してください。
モデルを永続化する時、すなわちModelのsaveメソッドを呼び出した場合、POST/PUT/DELETEリクエストが行われます。 どのメソッドでリクエストが行われるかは、モデルの状態に依存します。 すなわち、登録(新規作成)状態であればPOST、更新状態であればPUT 、削除状態であればDELETEとなります。
モデルの登録とPOSTリクエスト
新規作成されたモデルのsaveメソッドを呼び出した場合、POSTリクエストが行われます。
この時、リクエストURLはhttp://END_POINT_URL/items/
のように、エンドポイントに小文字でモデル名(複数系)が付与された形式です。
var newItem = this.store.createRecord('item', { name: 'JUnit実践入門', price: 3564 }); newItem.save();
リクエスト
リクエストには、次のようなJSONデータがモデル情報として付与されます。
{ 'item': { 'name': 'JUnit実践入門', 'price': 3564 } }
サーバサイドでは、このJSONデータをサーバサイドのモデルやフォームオブジェクトとして受け、RDBへの登録処理などを行います。
レスポンス
POSTリクエストのレスポンスでは、登録した結果のモデル情報をJSONデータとして返します。 この時、次のようにサーバサイドで確定されたIDをJSONデータに含める必要があります。
{ 'item': { 'id': 4, 'name': 'JUnit実践入門', 'price': 3564 } }
レスポンスのJSONデータにIDを含めなければ、クライアントサイドのStoreにモデルが永続化されたことが反映されませんので、注意してください。
モデルの更新とPUTリクエスト
storeのfindメソッドでサーバサイドから取得したモデルのsaveメソッドを呼び出した場合、PUTリクエストが行われます。
この時、リクエストURLは http://END_POINT_URL/items/4
のように、エンドポイントに小文字でモデル名(複数系)を付与し、IDを指定した形式です。
var item = this.store.find('item', 4); item.set('price', 3740); item.save();
内部的には、モデルのプロパティが変更されたかどうかの状態を持っており、変更が行われない場合はsaveメソッドを実行してもリクエストは送信されません。
リクエスト
PUTリクエストには、POSTの時と同様にモデル情報がJSONデータとして付与されます。 POSTリクエストと異なる点は、idが含まれている点です。
{ 'item': { 'id': 4, 'name': 'JUnit実践入門', 'price': 3740 } }
サーバサイドでは、このJSONデータをサーバサイドのモデルやフォームオブジェクトとして受け、RDBへの更新処理などを行います。
レスポンス
PUTリクエストのレスポンスでは、POSTリクエストと同様に、更新した結果のモデル情報をJSONデータで返します。
{ 'item': { 'id': 4, 'name': 'JUnit実践入門', 'price': 3740 } }
モデルの削除とDELETEリクエスト
deleteRecordメソッドで削除状態としたモデルのsaveメソッドを呼び出した時は、DELETEリクエストが行われます。
var item = this.store.find('item', 4); item.deleteRecord(); item.save();
この時、PUTリクエストと同様に、リクエストURLは http://END_POINT_URL/items/4
のように、エンドポイントに小文字でモデル名(複数系)を付与し、IDを指定した形式です。
リクエスト
DELETTリクエストでは、リクエストボディにJSONデータを含めません。
レスポンス
DELETTリクエストでは、レスポンスのJSONデータは不要です。
まとめ
ember-dataでのモデルの永続化をまとめると次のようになります。
操作 | メソッド | HTTP | URL |
---|---|---|---|
取得(全件) | var items = this.store.find('item'); | GET | http://END_POINT_URL/items/ |
取得(1件) | var item = this.store.find('item', 1); | GET | http://END_POINT_URL/items/1 |
生成 | var item = this.store.createRecord('item'); | - | - |
登録 | item.save(); | POST | http://END_POINT_URL/items/ |
更新 | item.save(); | PUT | http://END_POINT_URL/items/1 |
削除 | item.deleteRecord(); item.save(); |
DELETE | http://END_POINT_URL/items/1 |