web-dev-qa-db-ja.com

安らかなPOST対応のための「ベスト」プラクティス

だからここで新しい何も私はいくつかの明確化を取得しようとしていると他の記事で何かを見つけることができないようです。

私はうれしいことに新しいリソースを作成しています。

/books (POST)

体で:

{
  title: 'The Lion, the Witch and the Wardrobe',
  author: 'C. S. Lewis'
}

新しいリソースのLocationヘッダーを含む201(Created)を返す必要があることを私は知っています。

Location: /books/12345

私が自分では答えることができないような質問は、サーバーが本体に何を返すべきかということです。

私はよくこのような反応をしました:

{
  id: 12345,
  title: 'The Lion, the Witch and the Wardrobe',
  author: 'C. S. Lewis'
}

私はこれをいくつかの理由で行った。

  1. 私はanglejsのようなフロントエンドフレームワークのためにapiを書きました。私の特定のケースでは、私は角度のあるリソースを使用していて、それを見つけるためにリソースのIDだけが必要なことがよくあります。レスポンスボディにIDを返さなかった場合は、Locationヘッダから解析する必要があります。
  2. すべての本のGETでは、通常、IDだけでなくオブジェクト全体を返します。この意味で、私のクライアントコードは、IDをどこから取得するかを区別する必要はありません(ロケーションヘッダまたはボディ)。

今、私は本当にここにいる灰色の領域にいることを知っています、しかしほとんどの人が全リソースを返すことは「悪い」習慣であると言っています。しかし、サーバーが情報を変更またはリソースに追加した場合はどうなりますか。それは間違いなくidを追加しますが、タイムスタンプのような他のものも追加するかもしれません。リソース全体を返さない場合は、POSTを実行し、IDを返してから、クライアントにGETを実行させて新しいリソースを取得することをお勧めします。

179

更新時にオブジェクト全体を返すことはそれほど重要ではないように思えますが、オブジェクト全体が作成されたときに返すことが通常のユースケースでは悪い習慣になる理由はほとんどわかりません。これは少なくともIDを簡単に取得し、関連する場合はタイムスタンプを取得するのに役立ちます。これは実際にはRailsでスキャフォールドしたときのデフォルトの動作です。

最初のPOSTで取得した可能性のあるデータを取得するために、IDのみを返してからGETリクエストを実行することに利点はありません。

とにかくあなたのAPIが一貫している限り、私はあなたがあなたのニーズに最も合うパターンを選ぶべきであると思います。 REST AP​​Iを構築する方法の正しい方法はありません。

106
Daniel Perez

新しいオブジェクトを返すことは、「[Uniform Interface - 表現によるリソースの操作」」の原則[RESTに適合します。完全なオブジェクトは、作成されたオブジェクトの新しい状態の表現です。

API設計についての非常に優れた参照がここにあります: 実用的なRESTful APIを設計するためのベストプラクティス

ここにあなたの質問に対する答えが含まれています: 更新と作成はリソース表現を返すべきです

それは言います:

更新された表現のためにAPIコンシューマがAPIを再度ヒットする必要がないようにするには、応答の一部として更新された(または作成された)表現をAPIに返すようにします。

私にとってはとても実用的に思え、それは私が上で述べたそのREST原則に適合します。

171
grahamesd