[解決済み】データのPOSTに対する400と422のレスポンス
質問
私が取り組んでいる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
!
関連
-
[解決済み] RESTfulとRESTlessの違いについて
-
[解決済み] RESTとAPIの違いは何ですか?
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] リソースが既に存在する場合の POST に対する HTTP レスポンスコード
-
[解決済み】HTTPのPOSTとPUTの違いは何ですか?
-
[解決済み】URIの単語の区切り文字にハイフン、アンダースコア、キャメルケースのどれを使うか?
-
[解決済み] [Solved] リクエストに必須パラメータがない場合、どのようなHTTPステータスレスポンスコードを使用すればよいですか?
-
[解決済み】データのPOSTに対する400と422のレスポンス
-
[解決済み】API paginationのベストプラクティス
-
[解決済み] restfulなPOSTレスポンスのための「ベスト」プラクティス
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Apache Marathon REST APIを使用してDockerインスタンスをスケールアップする方法。
-
[解決済み] 403 Forbiddenと401 UnauthorizedのHTTPレスポンスの比較
-
[解決済み】RESTful 認証
-
[解決済み] [Solved] リクエストに必須パラメータがない場合、どのようなHTTPステータスレスポンスコードを使用すればよいですか?
-
[解決済み】有効なリクエストでありながら、データが空の場合の適切なRESTレスポンスコードは何ですか?
-
[解決済み】データのPOSTに対する400と422のレスポンス
-
[解決済み】動詞のないREST URLを作成する方法は?
-
[解決済み] restfulなPOSTレスポンスのための「ベスト」プラクティス
-
[解決済み】Node.js内でリモートRESTコールを行うには? CURLは?
-
[解決済み】REST認証スキームの安全性