これは難しいです。
私たちはすべきだと思います。
クライアントがリクエスト、ヘッダー、または本文に変更を加える権限を持っている場合にのみ4xxエラーを返します。これにより、リクエストは同じインテントで成功します。
予期されたミューテーションが発生しなかった場合、つまりDELETEが発生しなかった場合、またはPUTが何も変更しなかった場合に、エラー範囲コードを返します。ただし、POSTは、新しい場所でリソースを作成するか、ペイロードを処理するために使用する必要があると仕様に記載されているため、より興味深いものです。
Vishの回答の例を使用すると、要求が従業員Priyaをマーケティング部門に追加することを意図しているが、Priyaが見つからないか、彼女のアカウントがアーカイブされている場合、これはアプリケーションエラーです。
リクエストは正常に機能し、アプリケーションルールに到達し、クライアントはすべてを適切に実行し、ETagが一致しました。
HTTPを使用しているため、リソースの状態に対するリクエストの影響に基づいて応答する必要があります。そしてそれはあなたのAPIデザインに依存します。
おそらくあなたはこれを設計しました。
PUT { updated members list } /marketing/members
成功コードを返すことは、リソースの「置換」が機能したことを示します。リソースのGETは変更を反映しますが、反映しません。
したがって、適切なネガティブHTTPコードを選択する必要があります。これは、コードがアプリケーションではなくHTTPプロトコルを強く対象としているため、注意が必要な部分です。
公式のHTTPコードを読むと、この2つが適切に見えます。
409(競合)ステータスコードは、ターゲットリソースの現在の状態との競合が原因で、要求を完了できなかったことを示します。このコードは、ユーザーが競合を解決してリクエストを再送信できる可能性がある状況で使用されます。サーバーは、ユーザーが競合の原因を認識するのに十分な情報を含むペイロードを生成する必要があります。
と
500(内部サーバーエラー)ステータスコードは、サーバーが要求を実行できない予期しない状態に遭遇したことを示します。
私たちは伝統的に500を未処理の例外のように考えてきましたが:-/
一貫して適用および設計されている限り、独自のステータスコードを発明することは不合理ではないと思います。
この設計は扱いが簡単です。
PUT { membership add command } /accounts/groups/memberships/instructions/1739119
次に、常に命令の作成に成功するようにAPIを設計できます。これにより、201 CreatedとLocationヘッダーが返され、命令に関する問題はその新しいリソース内に保持されます。
POSTは、新しい場所への最後のPUTに似ています。POSTを使用すると、あらゆる種類のメッセージのサーバー処理が可能になり、「アクションは正常に失敗しました」などのデザインが開かれます。
おそらくあなたはすでにこれを行うAPI、ウェブサイトを書いています。支払いフォームをPOSTしましたが、クレジットカード番号が間違っていたため、正常に拒否されました。
POSTを使用すると、拒否メッセージとともに200または201を返すかどうかは、新しいリソースが作成され、別の場所でGETできるかどうかによって異なります。
そうは言っても、おそらくデータフィールドを更新するだけで、必要なPUTが少ないAPIを設計する傾向があります。また、ルールや処理を呼び出すアクションや、予想される失敗の可能性が高いアクションなどは、命令をPOSTするように設計できます。形。