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


217

したがって、ここでは何も新しいことはありません。説明を求めているだけで、他の投稿では何も見つけられないようです。

私は思い切って新しいリソースを作成しています:

/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. 私はangularjsのようなフロントエンドフレームワーク用のAPIを書きました。私の特定のケースでは、角度リソースを使用しており、リソースを見つけるためにリソースのIDだけが必要になることがよくあります。応答本文でIDを返さなかった場合は、Locationヘッダーから解析する必要があります。
  2. すべての本のGETでは、通常、IDだけでなくオブジェクト全体を返します。この意味で、クライアントコードは、IDをどこから取得するか(場所のヘッダーまたは本文)を区別する必要はありません。

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


個人的には、POST応答には空のボディを好みます。RESTful Locationヘッダー値はURI(一意のリソース識別子)であってはなりませんか?したがって、おそらくそれをIDとして使用し、解析してサーバーの内部IDを把握するべきではありません。IMO、RESTful APIコンシューマーは、特定のサーバーがリソースを見つける場所を推測して、提供されたハイパーリンクを使用してナビゲートする必要があります。これを繰り返すと、ネットワークリソースの浪費が発生します。
ch4mp

1
作成/挿入、ステータス201-作成済み、ヘッダーの場所→ localhost:8080 / employees / 1 (参照:こちら
Hassan Tareq

回答:


129

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

最初のPOSTで取得できるデータを取得するために、IDのみを返し、その後GETリクエストを実行することには、何の利点もありません。

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


26
私はこれが古いことを知っていますが、POSTの後にGETを使用することについて説得力のある引数を与えることができます。http / 1.1仕様では、GETツールから返されたキャッシュ設定をすべての履歴ツールで無視できます。そのため、POSTで更新した後にユーザーがブラウザの[戻る]ボタンを使用してこのページに戻ると、古くなります元のGETからキャッシュされたデータ。したがって、GETを再利用すると、キャッシュを更新して、ページが離れたときのページのスナップショットをより適切に取得できます...
シェーディング

8
@Shaded APIがアプリでも使用されるように設計されている場合、2つの要求を行うというあなたの主張は成り立ちません。そこでは、通常、モデルタイプのオブジェクトをメモリに保持することによってデータをキャッシュします。これは通常、POSTリクエストに対する応答で行われます。また、ブラウザーに関しては、GET apiエンドポイントがまだある限り、POST要求に対する応答は実際には問題ありません。
Jeehut 2017年

ここでダニエルの発言を購読します。Spring Dataのような成熟したフレームワークをチェックしても、永続化した後は常にオブジェクト全体が返されます。クライアントではサーバーの往復を保存して同じ情報を取得するため、これは良い習慣だと思います
frandevel

205

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

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

ここにはあなたの質問への回答が含まれています:更新と作成はリソース表現を返す必要があります

それは言う:

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

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


6
関連するオブジェクトのセット全体を返すのはどうですか?このようにして、可能なソートをサーバー側で行うことができ、フロントエンドの実装が容易になります
phil294

2
しかし、これらのベストプラクティスは最善ではありません。著者は、「準備ができていない」ため、他の原則と同じように重要なHATEOASを使用してはならないと述べています。すべてのRESTful原則は特定の実装ではなく、アーキテクチャ設計の原則にすぎないため、HATEOASが「準備」になることは決してありません。引用された参照は、RESTful APIに関する作成者のビジョンに関するものです。HATEOASを削除したため、RESTfulではありません。だからこそ、これは最良のリファレンスではありません:)
marcinn

1
@marcinn-元の質問には「Best」を引用していることに気付くでしょう。この分野には非常に多くの意見があるためです。私が指摘した参照は、実用的であることがわかったものです。より良いリファレンスがあればそれを共有してください。私はいつでももっと学びたいと思っています。
grahamesd

@grahamesd実装は、建築設計の原則/パターンとは異なるものです。HATEOASがいつか準備ができることを誰も期待することはできませんが、誰かが多くの人に受け入れられる実装を作成する可能性があります。Vinayは、httpメソッドをURLと特定の操作(CRUD)にマッピングすることについても述べ、URLのプレフィックスによるバージョン管理はより実用的であると述べ、クエリパラメータによるフィルタリングは適切な方法であると書いています... RESTfulアーキテクチャで行います。彼はある種の契約について書いた。これはHTTP APIには問題ありませんが、RESTfulとは呼ばないでください。
marcinn

- :ここに@grahamesdこの説明いくつかの記事ですmedium.com/@andrea.chiarelli/... - restfulapi.net
marcinn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.