2013-05-08 13 views
7

私はシンプルなCRUD REST APIを設計しています。これは初めてのことですので、私のデザインが理にかなっているかどうかについてのフィードバックを得たいと思っていました。シンプルなCRUD REST APIを設計するには

私はGET、POST、DELETE、およびUPDATEのHTTPメソッドを利用しています。 APIはJSON形式でデータを消費し、フェッチします。レコードがデータベースに作成されるPOSTリクエストの後

GET (list): curl http://<domain>/myapp/rest/v1/colors 
POST: curl -XPOST http://<domain>/myapp/rest/v1/colors -d '{ 
     "name": "red", 
     "shade": "light" 
     }' 
GET (single item): curl http://<domain>/myapp/rest/v1/colors/2 
DELETE: curl -XDELETE http://<domain>/myapp/rest/v1/colors/2 
etc... 

質問

:サンプルURLは、このようになります。だから、POST要求が新しく作成されたレコードのIDを返しますか? IDはUPDATE, DELETE and GET (single item)で使用できますか?

+0

あなたのレストサービスの設計方法によって異なります。 Ya、POSTリクエストはレスポンスボディを受け取ることができます。 – Joshi

+0

ありがとう、ええ、私はPOSTがボディを受け取ることができることを理解します。しかし、要求が処理された後、例えば、新しく作成されたレコードのIDが「659」 – birdy

+0

のように応答を送信することはできますか?それらのIDはデータベースと同期している場合に使用できます。 – Joshi

答えて

5

HTTP specificationがPOSTについては、以下を定義:

リソースがオリジンサーバ上に作成されている場合、応答は201である(作成)し、要求のステータスを記述し、参照したエンティティを含むべきです新しいリソースとLocationヘッダ(セクション14.30参照)に追加します。

だから、これは本質的意味:

  • をあなたは201 Createdあなたは、必要に応じて含めることができ、新しく作成したリソース
  • のURIを指し、Locationヘッダを返すべき
  • ステータスコードを返す必要がありますクライアントが別の GET要求を Locationヘッダーから取得された値に対して発行する必要がなくなるように、POST応答本体内のリソースの表現。
+0

niceの完全なURLを返します。 3番目の箇条書きでは、単に新しく作成したIDを返すことができます。 – birdy

+4

いいえ。最初はURI *は* IDです(したがって名前)。第2に、私は "リソースの表現"を書いています。これは、あなたが 'Location'ヘッダーのリンクをたどった場合、基本的に同じことを意味します。 –

1

POSTは、単一項目の新しいURLへのリダイレクトを返します。

おそらく、URLのバージョン識別子を失いたくなるでしょう。

代わりにさまざまなバージョンを適切に処理する方法で、表現とクライアントを設計します。たとえば、クライアントは特定の形式に依存する必要はなく、実際に必要な属性のみに依存する必要があります。

あなたの説明には、HATEOASの原則がありません。つまり、クライアントはURLをハードコードするべきではありませんが、他のエンティティの表現の中でさらなるアクションのURLを見つけるべきです。 URLから返された結果のサンプルドキュメントを表示していないので、これをうまくやったかどうかはわかりません。

this presentationをチェックしてください。トピックを説明し、Spring Libraryの実装に役立つSpringライブラリについても説明します。

+0

ありがとう、私はHATEOASの原則を知らなかった。btwタグが見つからなくても、これを達成するためにgrailsを使用しています。私はタグを追加します。したがって、IDだけを返す代わりに、投稿は「http:// /myapp/rest/v1/colors/2 ' – birdy

関連する問題