間違った入力に対する正しいHTTPステータスコード


169

200(すべてOK)ではなく、入力のエラーを報告する場合の最適なHTTP応答コードは何ですか?

同様に、サーバーにデータを送信すると、データが間違っていると応答します

使用して500より多くのサーバーの問題のようなルックスを
使用して200警告/エラー応答テキストが悪いと(可能キャッシングとすべてがOKではありません)
使用していない204、何もして返す多分良いです(しかし、うまくサポートされていますか?)
使用して、404要求されたパス(スクリプト)が利用可能であれば間違っていると、適切な場所に


詳細については、私の答えを参照してくださいstackoverflow.com/a/59527615/4127230
shiva2492

回答:


210

APIを作成するときにも同じ問題がありました。に相当するHTTPステータスコードを探していましたInvalidArgumentException。以下のソース記事を読んだ後、私たちは422 Unprocessable Entityどちらの状態を使用することになりました:

422(Unprocessable Entity)ステータスコードは、サーバーがリクエストエンティティのコンテンツタイプを理解しているため(415(Unsupported Media Type)ステータスコードが不適切)、リクエストエンティティの構文が正しい(つまり、400(Bad Request )ステータスコードが不適切)ですが、含まれている指示を処理できませんでした。たとえば、XMLリクエストの本文に整形式(つまり、構文的には正しい)が含まれているが、意味的に誤りのあるXML命令が含まれている場合に、このエラー条件が発生する可能性があります。

ソース:https : //www.bennadel.com/blog/2434-http-status-codes-for-invalid-data-400-vs-422.htm


138

4(4xx)で始まるコードは、クライアントエラー用です。たぶん、400(Bad Request)がこのケースに適しているでしょうか?http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.htmlでの定義によると、

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


13
400 Bad Request悪くはありませんが、通常は不正な構文のために予約する必要があります。OPは、整形式の構文で無効な値のケースをより懸念しているようです。プラス400はかなり一般的な「なんかおかしかった」応答コードであり、誤った入力の特定のケースと区別したい場合があります。
キーゴ2017

4
表現はRFC 7231で更新され、「不正な構文のためにサーバーはリクエストを理解できませんでした」が「サーバーはクライアントであると認識されているためにリクエストを処理できない、または処理しない」に更新されました。エラー(例:不正なリクエスト構文、無効なリクエストメッセージフレーミング、または不正なリクエストルーティング)。
Calimo、

14

RFC仕様に加えて、 これを実際に見ることもできます。Twitterの応答を確認してください。

https://developer.twitter.com/en/docs/ads/general/guides/response-codes


19
リンクから例を引き出すと、より多くの投票が得られる可能性があります。
Jared Thirsk、2016年


1
私にとってリンク(fb-developers.info/tech/fb_dev/faq/general/gen_10.html)はランダムな広告につながります。ドメインが偽装されたと思います
dmitry502

@ dmitry502なりすましリンクを削除するために回答が編集されました。コメントをありがとう
フランシス

9

409 Conflict 許容できる解決策になる可能性があります。

によると:https : //www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

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

ドキュメントは例に続きます:

競合は、PUTリクエストへの応答で発生する可能性が最も高いです。たとえば、バージョニングが使用されていて、PUTされるエンティティにリソースへの変更が含まれていて、以前の(サードパーティ)リクエストによって行われた変更と競合する場合、サーバーは409レスポンスを使用して、リクエストを完了できないことを示します。 。この場合、応答エンティティには、応答のContent-Typeで定義された形式で2つのバージョンの違いのリストが含まれている可能性があります。


私の場合、APIを介してデータベースに一意である必要がある文字列をPUTしたいと思います。データベースに追加する前に、まだデータベースにないことを確認しています。

あれば返却し"Error: The string is already in the database", 409ます。

これはOPが求めていたものだと思います。データがサーバーの基準を満たさない場合に適したエラーコードです。


2

以下のシナリオによると、

誰かが正しい形式のデータを使用してサーバーにリクエストを行ったが、単に「良い」データではなかったとします。たとえば、文字列値を期待するAPIエンドポイントに誰かが文字列値を投稿したとします。しかし、文字列の値にはブラックリストに登録されたデータが含まれていました(たとえば、パスワードとして「password」を使用できないようにしている)。ステータスコードは400または422のいずれかです。

これまでは、w3.orgによると、「400 Bad Request」を返していました。

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

この説明は状況に完全に適合しません。しかし、HTTP / 1.1プロトコルで定義されているコアHTTPステータスコードのリストを参照すると、おそらくそれが最善の策です。

しかし最近、私の開発チームの誰かが、人気のあるAPIがHTTP拡張機能を使用してエラー報告をより詳細に取得し始めていることを指摘しました。具体的には、TwitterやRecurlyなどの多くのAPIが、WebDAVのHTTP拡張で定義されているステータスコード「422 Unprocessable Entity」を使用しています。HTTPステータスコード422の状態:

422(Unprocessable Entity)ステータスコードは、サーバーがリクエストエンティティのコンテンツタイプを理解しているため(415(Unsupported Media Type)ステータスコードが不適切)、リクエストエンティティの構文が正しい(つまり、400(Bad Request )ステータスコードが不適切)ですが、含まれている指示を処理できませんでした。たとえば、XMLリクエストの本文に整形式(つまり、構文的には正しい)が含まれているが、意味的に誤りのあるXML命令が含まれている場合に、このエラー条件が発生する可能性があります。

上記のパスワードの例に戻ると、この422ステータスコードはより適切に感じられます。サーバーはあなたが何をしようとしているのかを理解しています。送信するデータを理解している。単にそのデータを処理させないだけです。


-7

404-見つかりません-要求されたURIが無効であるか、ユーザーなどの要求されたリソースが存在しない場合に使用できます。


2
OPはすでにそれを除外しました:「要求されたパス(スクリプト)が利用可能で適切な場所にある場合、404の使用は間違っています
Remy Lebeau 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.