Kaseyが主要なポイントをカバーしています。
任意のWeb APIの重要なアイデア:ドメインをドキュメントストアのように適合させること。GET / PUT / POST / DELETEなどは、すべてドキュメントストアとやり取りする方法です。
したがって、どのコードを使用するかについて考える方法は、ドキュメントストアでの類似操作が何であるか、そしてその失敗がこのアナログでどのように見えるかを理解することです。
2xxは完全に不適切です
ステータスコードの2xx(成功)クラスは、クライアントの要求が正常に受信され、理解され、受け入れられたことを示します。
5xxも不適切です
ステータスコードの5xx(サーバーエラー)クラスは、サーバーがエラーを認識していることを示します
この場合、サーバーは間違いを犯していません。現時点では、そのリソースをそのように変更することは想定されていません。
ビジネスロジックエラー(ビジネス不変条件では現時点で提案された編集が許可されていないことを意味する)は、おそらく409
409(競合)状態コードは、ターゲットリソースの現在の状態と競合するため、要求を完了できなかったことを示します。このコードは、ユーザーが競合を解決してリクエストを再送信できる状況で使用されます。サーバーは、ユーザーが競合の原因を認識するのに十分な情報を含むペイロードを生成する必要があります。
この最後のビットに注意してください-409応答のペイロードは、何が間違っているかについて消費者に情報を伝える必要があり、理想的には競合を解決するのに役立つリソースに消費者を導くハイパーメディアコントロールを含める必要があります。
私の解決策は、409が原因で何かが失敗したときにクライアントに通知を表示するAJAX呼び出しの失敗ハンドラーをラップすることでした-これはすべて問題なく、同じメカニズムを使用する他の4XXおよび5XXエラーと一緒にうまく機能します。
そして、これを問題として指摘します。クライアントでの実装では、ステータスコードが問題を定義するのに十分であると想定していました。代わりに、クライアントコードはペイロードを確認し、そこで利用可能な情報に基づいて行動する必要があります。
つまり、結局のところ、ドキュメントストアがそれを行う方法
409 Conflict
your proposed change has been declined because ${REASON}.
The following resolution protocols are available: ${LINKS[@]})
a 400 Bad Request
と同じアプローチも受け入れられます。「おおよそ」は「リクエストに問題がありました」に変換されます。どのステータスコードが最適かわからないので、ここで説明します。詳細については、ペイロードをご覧ください。」
422を使用します。入力は有効であるため、400は使用するのに適切なエラーコードではありません
WebDAV仕様にはこの推奨事項が含まれています
422(Unprocessable Entity)ステータスコードは、サーバーがリクエストエンティティのコンテンツタイプを理解し(したがって、415(Unsupported Media Type)ステータスコードが不適切である)、リクエストエンティティの構文が正しいことを意味します(したがって、400(Bad Request )ステータスコードは不適切です)が、含まれている指示を処理できませんでした。たとえば、XML要求本文に整形式(つまり、構文的には正しい)であるが、意味的に誤ったXML命令が含まれている場合、このエラー状態が発生する可能性があります。
私はそれが完全に一致するとは思わない(400
代替としていくつかの疑問を投げかけることに同意するが)。私の解釈は、422
「あなたは間違ったエンティティを送信しました」という意味ですが、「409
間違った時間にエンティティを送信した」ということです。
別の言い方422
をすれば、リクエストメッセージが単独で考慮される問題を409
示します。リクエストメッセージがリソースの現在の状態と競合することを示します。
422のBen Nadalの議論は検討するのに役立つかもしれません。
400 Bad Request
です。この分離の理由は、将来のシステム、開発者、またはドキュメントの読者が、世界標準からの逸脱によって混乱する可能性があるためです。