1. ホーム
  2. rest

[解決済み】データのPOSTに対する400と422のレスポンス

2022-03-24 20:51:33

質問

私が取り組んでいるquot;REST-like"APIで、異なるシナリオで返すべき正しいステータスコードを見つけ出そうとしています。例えば、JSON形式の購入をPOSTすることができるエンドポイントがあるとします。 それは次のようになります。

{
    "account_number": 45645511,
    "upc": "00490000486",
    "price": 1.00,
    "tax": 0.08
}

クライアントが(予想される "tax" ではなく) "sales_tax" を送ってきた場合、何を返すべきでしょうか。 現在、私は400を返しています。 しかし、私はこのことについて自分自身に疑問を持ち始めました。 本当に422を返すべきなのでしょうか? つまり、これはJSON(サポートされている)であり、有効なJSONですが、必須フィールドをすべて含んでいないだけなのです。

解決方法は?

400 Bad Request は、あなたの使用例に最適な HTTP/1.1 ステータスコードであると思われます。

ご質問の時点では (そして私の最初の回答)。 RFC 7231 はなかったことにして、その時点で私は異議を申し立てた 400 Bad Request というのも RFC 2616 と述べています(強調は私)。

サーバーがリクエストを理解できなかった 不正な構文により .

であり、あなたが説明したリクエストは構文的に有効なJSONを構文的に有効なHTTPで包んでいるので、サーバーには何の問題もありません。 シンタックス を送信します。

しかし コメントでLee Saferiteが指摘したように , RFC2616を廃止したRFC7231には、この制限はありません。 :

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


しかし それ以前は (あるいは、RFC 7231だけがと屁理屈をこねるなら 提案された を参照してください)。 422 Unprocessable Entity には見えません。 不正確な として、HTTP ステータスコードを使用します。 は、RFC4918の序文に書かれています。

HTTP/1.1が提供するステータスコードで十分であるのに対し WebDAVのメソッドで遭遇するほとんどのエラー状況を説明しますが、中には は、既存のカテゴリにきちんと分類されないエラーもある。 この仕様では、WebDAV のために開発された特別なステータスコードを定義しています。 メソッド(セクション11)

そして の説明文は 422 は言う。

ステータスコード422(Unprocessable Entity)は、サーバーが は、リクエストされたエンティティのコンテンツタイプを理解しています(したがって 415(Unsupported Media Type)のステータスコードは不適切である。 リクエストエンティティの構文は正しい(したがって400 (Bad Request) ステータスコードは不適切です)しかし、含まれる処理を行うことができませんでした。 という命令があります。

(シンタックスに言及していることから、7231は4918を一部廃止したものと思われる)

この音は まさに しかし、念のため、次のように書いてあります。

例えば、このエラー状態は、XML リクエストボディには、整形式(つまり構文的に正しい)であるが 意味的に誤ったXML命令である。

("XML" を "JSON" に置き換えれば、それがあなたの状況であることに同意できるかと思います)

さて、RFC 4918 は Web Distributed Authoring and Versioning (WebDAV) に関する HTTP Extensions であり、あなたは (おそらく) WebDAV に関わることは何もしていないので、そのようなものを使うべきではないと反論する人がいるでしょう。

そのような状況を明示的にカバーしていないオリジナルの規格のエラーコードを使うか、その状況を正確に記述している拡張機能のエラーコードを使うか、どちらかを選ぶとしたら、私は後者を選びますね。

さらに RFC 4918 21.4項 を参照しています。 IANA ハイパーテキスト転送プロトコル(HTTP)ステータスコードレジストリ であり、ここで422を求めることができる。

私は、HTTPクライアントやサーバーが、レジストリから任意のステータスコードを使用することは、それが正しく行われる限り、全く合理的であることを提案します。


しかし、HTTP/1.1の時点では RFC 7231 を使用すればよいのです。 400 Bad Request !