26

/api/shipments/100HTTP DELETEメソッドをサポートするリソース(例:)があると仮定します。URI自体から理解できるように、このURIに対してDELETE要求が行われると、このリソースは削除されます。

私の現在のシナリオでは、次のように特定の条件が満たされた場合にのみ、DELETE要求を正常に実行できます。

  • 出荷状態がInTransitまたはDeliveredに設定されていない場合。

そのURIに対してDELETEリクエストがあり、上記の条件が満たされない場合、その場合に返すのに適切なHTTPステータスコードはどれですか。私は以下のものについて考えましたが、どちらがよりセマンティックであるかを決定できませんでした:

  • 405メソッドは許可されていません
  • 403禁止します
  • 409競合
4

2 に答える 2

27

409: Conflictあなたが持っているのは資源状態の違反なので、私は一緒に行きます。

405: Method Not Allowedまた動作します。を使用する場合は、サポートされているメソッドを示すヘッダー405を送信する必要がAllowあります。サポートされているメソッドは、リソースの状態によって異なります。私の意見では、この応答コードは読み取り専用リソース、削除できないリソースなどに適していますが、この投稿に対するDarrelのコメントは有効です。仕様があいまいです:

Request-Lineで指定されたメソッドは、Request-URIで識別されたリソースには許可されていません。応答には、要求されたリソースの有効なメソッドのリストを含むAllowヘッダーを含める必要があります。

いずれの場合も、クライアントがエラーの原因を理解できるように、応答本文に情報を提供する必要があります。


上記の他の2つの方法について:

403: Forbiddenリソースを変更するための適切な権限がない場合、つまり、そのリソースを削除するために管理者である必要があり、そうでない場合に使用する必要があります。

412: Precondition Failed主に、前提条件がリクエストヘッダーで明示的に指定されている条件付きリクエストに使用されます。たとえば、If-Matchヘッダーが有効な場合にのみ実行する必要がある条件付きPUTリクエストを作成できます。リクエストヘッダーに何も指定しない場合でも、412ではなく409を選択します。412の仕様は次のとおりです。

1つ以上のrequest-headerフィールドで指定された前提条件は、サーバーでテストされたときにfalseと評価されました。この応答コードにより、クライアントは現在のリソースメタ情報(ヘッダーフィールドデータ)に前提条件を設定できるため、要求されたメソッドが意図したもの以外のリソースに適用されるのを防ぐことができます。

于 2012-10-22T13:53:20.473 に答える
2

412:前提条件が失敗しました。

HTTPステータスコードについてはこちらをご覧ください

Webステータスコード

于 2012-10-22T13:55:06.710 に答える