8

私は現在 Web API を構築していますが、どの HTTP ステータス コードを返すのが最も適切かを判断できないという特定のシナリオがあります。

シナリオ

連絡先リソースのコレクションを所有する「クライアント」リソースがあります。

不変条件として、クライアントには常に少なくとも 1 人の連絡先が必要です。したがって、連絡先を削除する要求が行われ、この連絡先が特定のクライアントの最後の連絡先である場合、「最後の連絡先を削除できません」として要求を満たすことができないことを示す適切な HTTP 応答を返す必要があります。

私の感じでは、これは「4xx クライアント エラー」のカテゴリに該当するはずです。

次のステータス コードを検討しました。

400 Bad Request - サーバーが理解できない不正なリクエストに関するものであるため、これを除外しました。

405 メソッドは許可されていません - 最初はこれが適しているように見えますが、405 はこのメソッドが許可されるべきではないことを示していると思いますが、上記のシナリオは一時的なものにすぎません。考え?

409 Conflict - 私はこれに傾倒してきましたが、このコードの一般的な例は、一般的に同時実行例外/編集の競合です。

このシナリオで私がどのように対応すべきかについて、誰かがガイダンスを持っていますか?

4

1 に答える 1

9

重要なのは、特定のステータス コードが使用されたときのクライアントとキャッシュの期待を調べることです。

見るのに役立つ RFC2616 の一部を次に示します。

10.4.1. 400不正な要求

構文が正しくないため、サーバーは要求を理解できませんでした。クライアントは、変更なしでリクエストを繰り返すべきではありません。

これは、リクエスト自体が構文的にもプロトコル的にも完全に間違っていることを示しています。あなたの特定のケースは実際にはアプリケーションプロトコルエラーであるため、これは実際に適切かもしれません.

10.4.6. 405メソッドは許可されていません

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

これは一時的なステータス コードです。DELETEが具体的に連絡先リソース自体を参照している場合(例: DELETE /contacts/D9DF5176-EEE4-4C70-8DA7-BA57B82027A8)、これはおそらく最も適切なステータス コードです。ただし、DELETEが別のリソースまたはクエリを含むリソース (例: DELETE /contacts?index=12) にある場合は、405 を返しません。また、通常DELETE、クエリに似たものを使用することは避けます。

10.4.10. 409 紛争

リソースの現在の状態と競合するため、要求を完了できませんでした。このコードは、ユーザーが競合を解決してリクエストを再送信できると予想される状況でのみ許可されます。応答本文には、ユーザーが競合の原因を認識するのに十分な情報を含める必要があります。理想的には、応答エンティティには、ユーザーまたはユーザー エージェントが問題を解決するのに十分な情報が含まれます。ただし、それは不可能な場合があり、必須ではありません。

一見すると、これが最も適切なステータスのように思えます。あなたの場合、私はおそらく400を好むでしょう。409 は、リソースとの競合があることを明確に示しますが、リソースを完全に変更する (つまり、最初に連絡先を追加する) 以外に結果を変更する可能性があるリクエスタが実際にできることは何もありません。409 応答のほとんどは、取得後に変更されたリソースを変更しようとするなど、楽観的な同時実行エラーでした。たとえば、Apache Adbera で構築された AtomServer によって返される同時実行エラーを見てください。

それで、そのすべてで。私はおそらく400 Cannot Delete Last Contact応答ラインとしてのようなものを使用するでしょう. ステータス コードに関連付けられたフレーズは変更できることに注意してください。このようなことをするのは本当に良い時期です。

于 2012-12-12T02:32:06.570 に答える