web-dev-qa-db-ja.com

REST DELETEが不可能な場合のHTTPステータスコード

私の質問は、リソース上で[〜#〜] delete [〜#〜]が不可能な場合のHTTPステータスコードに関する非常に一般的な質問です(ただし、ユーザーの権利に関するものではありません)。

リソースのタイプにRESTful APIがあります。

[〜#〜] delete [〜#〜]メソッドはリソースに対して許可されますが、特定の条件下ではリソースを削除できません(データがこのリソースにバインドされている場合)。

この状況でクライアントに返す正しいHTTPステータスコードは何ですか?

ここに私が集めた可能性のいくつかと、それが私の場合に不適切と思われる理由を示します。

  • 4Forbidden):主にユーザーの権限に関連しているようです。
  • 405Method Not Allowed):このタイプのリソースに対してこのメ​​ソッドに応答するようにAPIが設計されていないようです。
  • 409Conflict):適切と思われるが、クライアントはAPIとの競合を解決する可能性があるはずだが、それはそうではないここにケース。

更新:リソースの削除を妨げるデータバインディングは、REST APIを使用して変更できません。ただし、リソースはデータベースとは別の方法で「解放」できますデータの取得元であるリソースは、リソースの状態を変更する可能性のある他のアプリからもアクセスされます(DB内のSQL DELETEでいつでも変更できます)。

42
Matt

RFCの文言を考えると、409が最も適切だと思います。

409(競合)ステータスコードは、ターゲットリソースの現在の状態との競合が原因で要求を完了できなかったことを示します。このコードは、ユーザーmightが競合を解決し、リクエストを再送信できる状況で使用されます。サーバーは、ユーザーが競合の原因を認識するのに十分な情報を含むペイロードを生成する必要があります。

(エンファシス鉱山)

質問の説明の私の理解に基づいて、DELETEが許可されない理由は、正確にターゲットリソースの現在の状態との競合です。 RFCで示されているように、応答ペイロードは理由を示し、オプションで、ユーザー()を解決できる場合があります。 APIが競合解決の可能性を提供していないという理由だけで、仕様に409を不適切にするものは見当たりません。

28
E-Riz

409 Conflictクライアントが競合を解決できず、要求を後で削除できない場合、応答は間違いです。つまり、リソースが削除できるかどうかを追跡する状態を持たない限り、409 Conflictは適切ではありません。

403 Forbiddenは必ずしも許可されていないという意味ではありません。

ただし、資格情報とは無関係の理由により、要求が禁止されている場合があります。
- RFC 7231

ただし、通常はその意味があります。このコードを使用できますが、混乱を招く可能性があります。メソッドが実際に承認を必要とする場合は特に注意が必要です。応答に、失敗が承認に関連しているか、リソースが削除不可であるかを示すコードまたは何かが必要です。

405 Method Not Allowedが正しい方法です。

405(Method Not Allowed)ステータスコードは、request-lineで受信したメソッドがOriginサーバーによって認識されているが、ターゲットリソースによってサポートされていないことを示します。
- RFC 7231

メソッドDELETEは、このリソースではサポートされていません。それはまさにあなたが記述していることのように聞こえます。 HTTP仕様には、リソースの種類という概念が実際にありません-リソースだけです。人々は健全性のために同じエンドポイントの下で個々のリソースをグループ化することがありますが、それは開発者とユーザーにとって便利なだけです。 HTTP仕様に関する限り、/widgets/12および/widgets/15および/widgets/3453は3つの異なるリソースです。同じオブジェクトがサーバー上の3つのリソースすべてを表すという事実は、まったく無関係です。私はそれがあなたが考えている「タイプ」だと思いますが、HTTPにとってそれは単なる実装の詳細です。

16
Eric Stein