422 Unprocessable Content

リクエストの形式は正しいものの、検証に失敗しました。

使いどころ

終了日が開始日より前など、値が無効な有効 JSON。

よくある原因と対処法

422 は、サーバーが構文は理解したものの、内容が検証に通らなかったことを意味します。必須フィールドが空、メールアドレスの形式が不正、日付の範囲が逆、参照先の ID が存在しない、といったケースです。FastAPI は Pydantic の検証エラーすべてに対してこれを返し、Rails と Laravel はモデルの検証失敗に使います。Rails は無効な CSRF トークンにも 422 を返すため、驚く人がいます。

クライアントが該当する入力欄の横にエラーを表示できるよう、フィールド単位のエラーをボディで返しましょう。RFC 9457 の problem details のような一貫した形式が理想的です。データを変更せずに 422 を再試行してはいけません。400 と 422 のどちらを使うかはチームによって意見が分かれます。たとえば、パースできない入力には 400、形式は正しいが無効な入力には 422 のように 1 つのルールを決めて、どこでも適用してください。

クライアントエラー (4xx)

4xx はクライアントエラーです。リクエスト自体が誤っている、認証されていない、または存在しないものを指しています。同じリクエストを再試行しても解決しません。

レスポンスでの表示

HTTP/1.1 422 Unprocessable Content

返し方

Node.js / Expressres.status(422).end()
Python / Flaskreturn '', 422
nginxreturn 422;

確認方法

curl -s -o /dev/null -w "%{http_code}\n" https://example.com/

HTTP ステータスコードを開く