“ Thing not found”の場合、どのHttpコードを返す必要がありますか?

StackOverflow https://stackoverflow.com/questions/1027300

  •  06-07-2019
  •  | 
  •  

質問

iは、この特定のケースで、利用者に関する情報を要求するために使用されるWebサービスを構築しています。

議論のために、ルックアップWebのヒットは次のとおりであるとしましょう:

GET /patrons/619 HTTP/1.1

利用者が見つかった場合、コード200を返します:

HTTP/1.1 200 OK

省略した場合、または番号ではないアカウント番号を指定した場合、400を返します。たとえば、次のような悪いリクエスト:

GET /patrons HTTP/1.1
GET /patrons/ HTTP/1.1
GET /patrons/G619 HTTP/1.1
GET /patrons/kirsten%20guyer HTTP/1.1

すべてがエラー400(不正なリクエスト)を返します。例:

HTTP/1.1 400 Invalid patron number

iは、 利用者が見つかりません のステータスコードを取得し、HTTPステータスコードとして返します。例:

GET /patrons/1322 HTTP/1.1

HTTP/1.1 404 Not Found

私は 404(見つかりません)を使用することを考えました。これは有効な応答です(要求されたリソースは実際に見つかりませんでした。)しかし私はデバッグする人は、 / patrons / のつづりが間違っていることを意味していると思うかもしれません。

誰でも使用できる別のhttpステータスコードを思い付くことができますか?


更新:目を光らせています

204 No Content 
The server successfully processed the request, but is not returning any content. 

あなたの言うこと


すべてのHTTPサーバーがHTMLコンテンツを提供するわけではないことを忘れないでください。 IIS Webサーバーが次のリソースを要求された場合:

GET /MyStartPage.html HTTP/1.1

その後、HTTPサーバーは応答するものを決定する必要があります。ほとんどのWebサーバーでは、 /MyStartPage.html という名前のリソースは、ハードドライブにあるファイルに対応しています。

StackOverflowの機能:

GET /posts/1027301 HTTP/1.1

そのリソースが存在しない場合、Webサーバーは(正しく)404を返す必要があります。

役に立ちましたか?

解決

404 Not Foundは返すべき正しいものです。それがサービスである場合、それは実際に人間によって使用されているのではなく、マシンによって使用されているので、タイプミスは最初の懸念ではありません。

また、とにかく人間の行動に対抗するためにできることはほとんどありません(実際には別のことを考えて)。エラーコードの一部として小さなエラーメッセージを返している場合、すべてがうまくいくはずです。修正を提案することもできます。

アプリケーションが意図したとおりに動作しているときに500を返すことも少し奇妙に思えます。 404は状況を正確に説明しています。リソースが見つかりません。

他のヒント

404を使用する必要があると思います。APIの開発者は404の意味を理解しているため、問題を解決するために独自の通常のデバッグプロセスに従います。プロトコルに固執します。

エラー404は、実際にはリソースが見つからないため、このケースではより受け入れられる応答です。常に、パトロンIDが見つからないことを説明するカスタムエラードキュメントを作成できます。

400エラーは、クライアントが不正な構文を送信したことを意味しますが、この例ではそうではありません。したがって、このエラーコードは使用しないでください。 " Bad Request"正確ですが、これが実際に意味するのは、リクエストヘッダーの構文にエラーがあることです。

エラーも発生していないため、これも500エラーではありません。 Webサーバーがリクエストを実行しても問題はありません。実際、リクエストは存在しないリソースを探しています。

404が唯一の適切な応答です。完全に有効な要求と見なしたい場合を除き、ステータス200と、要求された後援者が存在しないことを説明するページを返します。

質問に対する元のコメントから:

  

200レベルのエラーも適切ではないと思います。W3の説明を考慮してください w3.org/Protocols/rfc2616/rfc2616-sec10.html

IMHO、エラーはHTTPレベルではないため、HTTP応答はこれを処理する適切な場所ではありません 。アプリケーションレベルです。考えられる解決策の1つは、ヌルオブジェクトパターンを使用して、以下に準拠するヌル「パトロン」を返すことです。 Patronインターフェース。ただし、そのような人物は存在しないことを示します。


更新:この答えは間違っていると確信しています。ただし、有効な回答である可能性があるため(質問に記載されていない詳細に応じて)、コメントは有益であると考えています。

通常、サービスで処理できないエラーが発生したが、リクエストの形式が正しい場合は、500ステータスコードを返したいと思います。

また、500が適切だと言うもう1つの理由は、.NET Webサービスでの経験から、ネットワーク全体で例外(RecordNotFound例外など)をスローするたびに、Webサーバーとクライアントが常に500ステータスコードへの応答。

どちらにしても、このリストを確認することをお勧めしますhttpステータスコード、および必要に応じて最適なコードを提供します。

構築するWebサービスの種類によって異なります。

SOAPおよびXML Webサービスは通常、要求されたオブジェクト(パトロン)が見つからない場合に200 OKを返し、エラータイプ/メッセージ/説明を応答ドキュメントにエンコードします。トランスポートレベル(HTTP)と交換されるメッセージ(XML)を分離します。存在しないAPIエンドポイント(間違ったURL)をリクエストした場合のみ、404エラー(トランスポートレベル)が返されます。

REST Webサービスでは、メッセージ交換のためにHTTPメソッドとステータスを直接使用します。 RESTはさまざまなHTTPメソッド(GET / POST / PUT / DELETE)を使用して、必要なアクションを指定し、サーバーはHTTPステータスとしてステータスを返します。したがって、REST Webサービスの場合、利用者が見つからない場合、404が適切なHTTPステータスになります。

500はどのような場合でも不適切です。5xxはサーバーサイドに何か問題があることを意味しますが(そうではありません)、4xxエラーはクライアントサイドに何か問題があることを意味します。

4年前かもしれませんが、それでもかなり関連しています。ブラウザとネイティブアプリの両方で使用されるAPIの場合、ステータス表示にHTTPコードを使用する方がはるかに簡単です。また、必要に応じて、既存のHTTPコードに適合しない条件のために、未割り当てのものからいくつかの追加コードを使用します。

Webサービスレベルのエラーは、単純なHTTPステータス行を返すだけでなく、サービスにアクセスするクライアントが解析できる有効で文書化された形式でコンテンツを返す必要があります。返されるドキュメントには、Webサービスに固有のドキュメント化されたコードセットの一部であるエラーコード、問題の簡単な説明、およびオプションで問題のより詳細な説明が含まれている必要があります。

HTTP応答コードを介してWebサービスの応答を制御する場合、実際に404を使用してこの状態を示すことができます。

ただし、Webサービスの応答をHTTP応答の本文で完全に定義し、通信を成功させるには200を返す方が自然だと思います("要求を理解し、適切な応答を送信しました" )。この場合、リクエストのペイロード(XMLまたはJSONなど)に通常の200を返し、一致するエンティティが見つからなかったことを示します

従来のプログラミング言語の例外に似た200以外のエラーコードと、リターンコードに似たHTTP応答本文を検討します。これを従来の方法で実装している場合を想像してください-エンティティが見つからない場合に例外をスローするか、 null を返しますか?個人的には、ネットワーク接続の脆弱な性質を考えると、通信の問題のためにすべてのHTTPレベルのエラーコードを予約し、サービス自体から 200 OK を常に返すようにします。結果またはサービスレベルエラーを指定するペイロード。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top