私はRESTインターフェースを設計していますが、挿入/更新/削除動詞が返されるべきかどうか(レスポンスの内容として)困惑しています。 api/invoices
でアクセス可能Invoice
エンティティのintefaceをし、考えてみましょう:コレクション、アイテム、動詞、RESTインターフェイスデザイン:POSTは何を返すべきですか?
GET /api/invoices
は、請求書のリストを返しますGET /api/invoices/123
戻っID 123POST /api/invoices
と請求書が(サーバー上で生成されたID)新しい請求書を追加しPOST /api/invoices/123
IDを使用した請求書の更新123DELETE /api/invoices/123
IDを持つ請求書を削除します。123
最初の2つのメソッドが返すはずのものはかなりわかりますが、挿入/更新/削除の方法はどうですか?明らかな答えは、add
は、新しく作成されたアイテム(GET/api/invoices/idとまったく同じ応答)を返さなければならないということです。update
は更新されたアイテムを返します(GETと同じです)。delete
は、空のコンテンツ)。これはすべて理にかなっており、合理的です。
しかし、私の問題は、Invoiceエンティティほど簡単ではないアイテムを検討するときに始まります。例えば、add
リクエストは、アイテムを追加するだけでなく、実際には追加操作に関するいくつかの追加情報を返す必要があります。アイテムは受け入れられました(成功)、アイテムは重複しています(成功した情報)、アイテムは無視されました情報で成功、私は詳細にeneterしません)、項目は拒否された(失敗)。私の場合も、私が戻ってきたい追加情報があります。新しく追加された項目にバケツ用にあらかじめ設定された「応答」情報が壊れます。私はHTTPヘッダーのすべての余分な情報を帯域外情報の一種(200の範囲とカスタムヘッダーのような余分なステータスコードのようなもの)として置くことを考えましたが、ハックであり、 '応答'部分は実際にはアイテム自体。だから私はadd
動詞は完全に新しいタイプ、追加情報(ステータス、応答、新しいアイテムのID、perhpas新しいアイテム全体)を含むアイテムを返すと考えています。それは確かに仕事を終わらせるが、私は前に持っていた素敵な対称性を見逃している。
これはよい習慣(「foo」というタイプのアイテムを追加するときはリターンが 'bar'タイプです)、または6ヶ月後に振り返って私の髪を引っ張るものですか?バッグの?私が 'fooの任意のアクセスが追加を含むfooを返す'と固執すれば、クライアントは実際に関心のある情報(すなわち '応答')を取得するために 'add'操作の後に余分な呼び出しを行う必要があります。
私の「ハック」のコメントはカスタムHTTPヘッダーの追加に関するものでした。 HTTPステータスの場合、私はあなたに同意します。 –