リクエストに必須パラメーターがない場合、どのHTTPステータス応答コードを使用すればよいですか?


回答:


388

ステータス422は、仕様に基づいて最も適切と思われます。

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

彼らは、不正なxmlが不適切な構文の例であると述べています(400を要求)。不正なクエリ文字列はこれに類似しているように見えるので、400は、パラメーターが欠落している整形式のクエリ文字列には適切ではないようです。

UPDATE @DavidVは、この仕様がコアHTTPではなくWebDAV用であることを正しく指摘しています。しかし、いくつかの一般的な非WebDAV APIは、ステータスコードが不足しているため、とにかく422を使用しています(これを参照)。


2
IMOクエリ文字列の値が正しくない場合に使用します。余分な値や欠損値がある場合ではありません。すなわち。電子メールを期待し、その値は「123123」です
デレクリッツ

2
私はGETおよびPOSTパラメータをURLパスのメソッドシグネチャと考える傾向があるので、404は私にとって意味があります。一般向けのRESTful APIでは、不足している/余分なパラメーターを返すことが賢明です。URLのコンテキストでは、クエリ文字列パラメーターは通常、リソースを識別するために重要であり、余分なパラメーターまたは欠落しているパラメーターは、想定なしに存在しないリソースを表します。もちろん、明示的であることによる堅牢性とのトレードオフがあり、オプションのパラメーターはリソースを潜在的にサイレントエラーに対して脆弱にします。次に、使いやすさがあります...
デレクリッツ2013年

13
参照されている仕様はWebDAV用であり、HTTP標準仕様ではありません。
David V

1
@ケルビンそのブログ投稿を指摘してくれてありがとう。たとえば、Twitterが422を使用していることを確認すると役立ちます。仕様が最初の行のWebDAVであることを明確にすれば、答えはより良いと思います。私が最初にあなたの答えを読んだとき、私がリンクをたどるまで、あなたはHTTP標準仕様を意味すると思った
デビッドV

3
:これは、aが読んで価値があるbennadel.com/blog/...私はどちらかのparamを逃すために422を使用することはありません。400より適切だと思います。
Zelphir Kaltstahl 2017

184

標準が設定されているかどうかはわかりませんが、最新のHTTP仕様(2014年から)が次のように文書化している400 Bad Requestを使用したでしょう。

6.5.1。400不正な要求

400(Bad Request)ステータスコードは、クライアントエラーであると認識される何か(たとえば、不正な形式の要求構文、無効な要求メッセージのフレーミング、または不正な要求ルーティング)により、サーバーが要求を処理できないか、または処理しないことを示します。


65
400 Bad Requestセマンティックエラーではなく、プロトコルレベルの問題を示すことを目的としています。アプリケーションレベル(プロトコルレベルではなく)のエラーを示すためにHTTPステータスコードをハイジャックする場合は、どうしても最後まで使用し412ないでください。
Matt Zukowski、2010

36
GoogleのOAuth 1.0実装はこの回答に同意します。POSTパラメータがないか、サポートされていない場合、400応答が返さ
Tom

1
@ matt-zukowski: "412:1つ以上のリクエストヘッダーフィールドに指定された前提条件がサーバーでテストされたときにfalseと評価されました。" RFC2616から-POSTの場合、パラメーターはリクエスト本文にあり、リクエストヘッダーフィールドにはありません。技術的には、GETメソッドはリクエストヘッダーでパラメーターを送信しますが、代わりに一貫性を持たせたいですか?
toong

6
@MattZukowski 400は、アプリケーションレベルのステータスコードです。RFC 7231のドラフトバージョンの言い換えを見ると、それがわかります。最新の変更の著者はまた、422考案ので残念ながら、最新版の文言はそれほど明確ではない
ダレル・ミラー

9
@DarrelMillerは正しい(直接リンク):「400(Bad Request)ステータスコードは、クライアントエラーと見なされる何か(たとえば、不正な形式の要求構文、無効な要求メッセージ)が原因でサーバーが要求を処理できない、または処理しないことを示します。フレーミング、または不正なリクエストルーティング)。」セマンティクスと拡張性の期待に応じて(パラメーターなしでリクエストを発行できるようになる日があるでしょうか)、標準のHTTPでは400と404だけが適切と思われます。それ以外の場合は、APIの新しいコードを作成しますが、セマンティクスをオーバーロードしないでください。
2015年

31

.NET のWCF APIHTTP 404webHttpBindingの使用時に「Endpoint Not Found」エラーを返すことにより、欠落しているパラメーターを処理します。

404 Not Foundあなたはそのパラメータの署名と一緒にあなたのWebサービスメソッドの名前を考えた場合に意味をなすことができます。つまり、Webサービスメソッドを公開し、LoginUser(string, string)を要求してLoginUser(string)も、後者は見つかりません。

基本的に、これは、呼び出しているWebサービスメソッドと、指定したパラメーターシグネチャが見つからないことを意味します。

10.4.5 404が見つかりません

サーバーは、Request-URIに一致するものを検出しませんでした。状態が一時的であるか永続的であるかは示されません。

400 Bad Request、とゲルトが提案し、有効な応答コードのまま、私は通常より低いレベルの問題を示すために使用されていると思います。これは、不正な形式のHTTPリクエスト、HTTPヘッダーの欠落または無効などとして簡単に解釈できます。

10.4.1 400不正なリクエスト

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


これはCherryPyがデフォルトで行うことです。
Derek Litz、2013年

モデルを受け入れ、モデルの一部が欠落している投稿リクエストを処理する場合はどうですか?その場合、404は得られません。代わりに、私が間違っていない場合は無効なモデルが得られ、今何をするかを決定する必要があります。
Shane Courtrille、2015

1
この解釈はストレッチのようであり、REST POVではなくRPCを表します。URIは識別子であり、存在し、見つかっています。本文で送信されるものは、リソース識別子の一部ではありません。422がより適切です。
ジョナ

404が正解です。コンセンサスを見つけるには、ウェブ上のいくつかのURLを編集してください。
jenson-button-event

8

400 Bad Requestコードを送信できます。これは、より汎用的な4xxステータスコードの1つなので、意図したことを意味するために使用できます。クライアントが、アプリケーションが正しく処理するために必要な情報/パラメータが不足しているリクエストを送信しています。


7

APIプロジェクトの1つで、409 Statusをいくつかのリクエストに設定することにしました。パラメーターが不足しているため、100%で完全に満たすことができない場合です。

HTTPステータスコード「409コンフリクト」は、ユーザーがコンフリクトの原因を認識するのに十分な情報を含める必要があるため、試してみました。

リファレンス:w3.org/Protocols/

そのため、400や404などの他の応答の中で、409を選択して、新しい適切な要求を設定するのに役立つ要求内のいくつかのメモを調べる必要を強制しました。

いずれにしても、リクエストが完全に正しくない場合はデータイブを送信する必要があり、クライアントにメッセージを見てリクエストのどこが間違っているかを理解させる必要があるため、これは特別なケースでした。

一般に、欠落しているパラメーターがいくつかしかない場合は、400と欠落しているパラメーターの配列を使用します。ただし、特定のケースメッセージなど、さらに多くの情報を送信する必要があり、クライアントが確実に処理するようにしたい場合は、409を送信します。


2
これは明らかに間違っています。409は、@MaximeGélinasが、リソースがすでに存在し、重複が許可されていないOR状況を指摘しているため、同時実行性の問題に対応しています。
gimlichael

仕様によると、「409(競合)ステータスコードは、ターゲットリソースの現在の状態との競合が原因でリクエストを完了できなかったことを示しています。」。欠落しているパラメーターにそれを使用するのは間違っています。それはまったく別の種類のエラーです。
マークアメリー

5

必要なパラメーターの何かがAPIエンドポイントが必要とするものと一致しない場合(短すぎるパスワードなど)、通常は422(処理できないエンティティ)を使用しますが、パラメーターがない場合は406(許容できない)を使用します。


8
まあ、406 UnacceptableはAcceptヘッダーと共に使用されます(サーバーが応答を送信できない場合、クライアントは理解します)。「リクエストで識別されたリソースは、リクエストで送信されたAcceptヘッダーに応じて許容できないコンテンツ特性を持つレスポンスエンティティのみを生成できます。」。現在の仕様には「正しい」選択がないため、私は422で立ち往生しています:-/
JakubKnejzlik

これに406を使用するのは間違っています。406コードは、要求が受け入れられなかったことを意味するものではありません。提供できる応答は、クライアントが要求で送信したAcceptヘッダーに基づいて受け入れられないものであるため、要求を満たすことができません。(たとえば、リクエストにが含まれてAccept-Language: deおり、ドイツ語での応答のみを受け入れることを示していますが、サーバーで利用できるリクエストされたドキュメントのバージョンは英語またはフランス語のみです。)リクエストで欠落しているパラメーターを示すために使用すると、正しくありません。仕様の定義に従って。
マークアメリー

3

この場合、Spring MVC(少なくとも3.x)は400を返しますが、これは私には間違っているようです。

私はいくつかのGoogle URL(accounts.google.com)をテストし、必要なパラメーターを削除しましたが、この場合、それらは通常404を返します。

Googleをコピーします。


18
グーグルが行うからといって、グーグルが正しく行うという意味ではありません!
rve

4
私は同意します。必ずしも「正しい」とは限りませんが、時には正しいことと賢明なことの2つは異なるものです。とにかく..読者まで:)
Neromancer 2013年

一部のGoogle APIは400を返します。例:github.com/google/google-api-nodejs-client/issues/404
Dennis

これは間違っています(そして、Spring MVCがjax-rsに準拠していない理由)
jenson-button-event

3

404 Not Found指定されたリソースが見つからなかったため、a を使用する必要があると主張できます。


3
これは、クエリパラメータを適切なデータ型に変換できない場合のJava JAX-RSのデフォルトの動作です。私はそれに同意しません。リソースが見つかりました:クエリパラメータはリソースをフィルタリングするためのものであり、フィルタの1つに許容できない値が指定されました。これは最も近い422個のUnprocessable Entityに、2番目に400個のBad Requestに一致すると思います。
ライアン14

これは正しい動作であるため、jax-rsのデフォルトの動作です。
jenson-button-event

クエリ文字列パラメーターがリソースを識別するためのものである場合、404の使用は妥当ですが、値が指定されましたが、その値は存在するリソースに対応していません-たとえば、example.com / show-userをリクエストしている場合-profile?user_id = 123およびユーザー123は存在しません。しかし、それはこの質問が尋ねたことではありません。必須パラメーターが完全に省略されているシナリオについてでした。指定されたリソースが見つからないことに対応する方法がわかりません。
マークアメリー

2

私はよく403 Forbiddenエラーを使用します。理由はリクエストが理解されたということですが、私は尋ねられたようにはしません(物事が間違っているため)。応答エンティティは何が問題なのかを説明するため、応答がHTMLページの場合、エラーメッセージはページ内にあります。JSONまたはXML応答の場合、エラー情報がそこにあります。

rfc2616から:

10.4.4 403 Forbidden

サーバーはリクエストを理解しましたが、リクエストの実行を拒否しています。
承認は役に立たず、リクエストは繰り返されるべきではありません。
リクエストメソッドがHEADではなく、サーバー
がリクエストが実行されなかった理由を公開したい場合は、エンティティで拒否の理由を説明する必要があります。サーバーがこの情報をクライアントに提供したくない場合は、
代わりにステータスコード404 (見つかりません)を使用できます。


4
私は自然にこれを認証または許可ベースのエラーに関連付けますが、最初はいい音です。また、仕様では、「サーバーがこの情報をクライアントに提供したくない場合」と示されています。また、その404はより良いオプションかもしれません。私は403より404または400に向かうだろう
tonyhb

21
これは、技術的には健全であるとしても、ひどい考えです。403は認証失敗の応答に広く使用されており、これを使用してパラメーターエラーを示しようとすると、クライアントを混乱させることになります。たとえば、Twitterはこれを実行します。403は、無効なOAuth資格情報を提供する場合と、リクエストに意味上の問題がある場合の両方に使用され、APIクライアントにとって常に混乱の原因となります。
Matt Zukowski、2014年

1
@MattZukowskiよくそれは間違っています。仕様にはAuthorization will not helpが記載されているため、Twitterは無効なOAuth認証情報に対してこれを送信しないでください。
torvin 2018

@torvin Twitterが401 Unauthorized代わりに送信する必要があります。ただし、非常によく似ているこれらの2つのコードのMDNドキュメントの説明を見るとなぜそうでないのか理解できます。
Agi Hammerthief、

-1

参照または例としてASP.NET Coreを使用するためだけに、ASP.NET Coreではアクションを使用してコントローラーを足場できます。これが「詳細」アクションの外観です。

    // GET: Cars/Details/5
    public async Task<IActionResult> Details(int? id)
    {
        if (id == null)
        {
            return NotFound();
        }

        var car = await _context.Cars.FirstOrDefaultAsync(m => m.CarId == id);
        if (car == null)
        {
            return NotFound();
        }

        return View(car);
    }

パラメータidが設定されていない場合、404 Not Foundが返されます。


-5

404を返します -つまり、リソースが見つかりませんでした。

IDを含むサイトのURLを編集してみてください。私はいくつか試しました:

  • gitubレポの問題
  • 合流ページ
  • アマゾン製品ビュー
  • ebayリスト
  • BBCニュース記事

これらの開発者は標準を正しく解釈しているので、すべてが404を返しますが、ここや他の多くの答えはそうではありません!


1
私は、ほとんどの開発者が「パラメータ」をクエリ文字列またはフォームPOST本文の名前/値ペアの1つとして定義していると思います。Githubリポジトリの発行リクエストにはこれが含まれていません。
ケルビン

@Kelvin開発者もリストにパスパラメータを含めます。ANY urlパラメータが必須で、リソースの場所を表し、含まれていない場合、404が返されます。これにはが含まれませんrequestBody
jenson-button-event

-6

私は403で行きます。

RFC 2616から-ハイパーテキスト転送プロトコル-HTTP / 1.1

403禁止します

サーバーはリクエストを理解しましたが、リクエストの実行を拒否しています。承認は役に立たず、リクエストは繰り返されるべきではありません。リクエストメソッドがHEADではなく、サーバーがリクエストが実行されなかった理由を公開したい場合は、エンティティで拒否の理由を説明する必要があります。サーバーがこの情報をクライアントに提供したくない場合は、代わりにステータスコード404(見つかりません)を使用できます。

失敗の理由を回答で説明する必要があります。実行したくない場合は、404を使用してください。


3
これは重複した回答なので、反対票を投じました。403を使用することを提案している古い回答にコメントとして最新の文章を追加することを検討してください
ユーザー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.