クライアント リクエスト エラーに対して返される適切な http ステータス コードに関する多くの投稿や記事を読みました。RFC 7231で再定義された 400 を使用することを提案する人もいますが、例は構文上のものであるため、与えられた例がすべてのクライアント エラーをカバーしているかどうかはわかりません。
400 (Bad Request) ステータス コードは、クライアント エラーと見なされる何かが原因で、サーバーがリクエストを処理できない、または処理しないことを示します (例: 不正なリクエスト構文、無効なリクエスト
メッセージ フレーミング、不正なリクエスト ルーティング)。
rfc 7231 の付録 B に次のような記述がありました。
400 (Bad Request) ステータス コードが緩和
され、構文エラーに限定されなくなりました。(セクション 6.5.1)
これは、どのような種類のクライアント エラーも不適切な要求と見なすことができるということですか? クライアント要求に 400 を使用し、メッセージでより具体的なエラーを指定する方がよいでしょうか?
一方で、422 (Unprocessable Entity) を使用した方がよいという意見もあります。これはセマンティクスに重点を置いていますが、http/1.1 の webDAV 拡張である [RFC 4918][2] にのみリストされています。
422 (Unprocessable Entity) ステータス コードは、サーバー
がリクエスト エンティティのコンテンツ タイプを理解していることを意味し (したがって、
415 (Unsupported Media Type) ステータス コードは不適切です)、
リクエスト エンティティの構文は正しい (したがって 400 (Bad Request) )
ステータス コードが不適切です) が、含まれている命令を処理できませんでした。たとえば、このエラー状態は、XML
要求本文に整形式 (つまり、構文的に正しい) が含まれているが、
意味的に誤った XML 命令が含まれている場合に発生する可能性があります。
この webDAV 拡張コードを使用して http 要求を処理できますか? 422の場合、コアのhttpコードに入っていなくても使えますか?
クライアント エラーには 400 または 422 を使用する必要がありますか?
私が念頭に置いている可能性のあるクライアントエラーは次のとおりです。
1.) Invalid parameter. The client provided parameters but are found invalid. Example: I said that the userId is 1, but when I checked there's no userId of 1. Another example of invalid parameter is wrong data type.
2.) Missing required parameters
3.) Let's say I need to hash a value based on given params and it failed
4.) Blocked content is being used. Like, i want to apply for membership and i passed the userId of 1. However, userId of one is blocked / deactivated
5.) When I try to delete an entry but the entry is still being used in another table.
6.) Let's say i require a signature in my payload and the signature does not match when recalculated in the backend
7.) Let's say I have a value that counts a specific attribute like "shares" and it has reached the maximum value like 10.
etc...
有益な回答をいただければ幸いです。どうもありがとう、みんな!
更新: Google API のエラーを確認したところ、422 が使用されていませんでした。一方、Twitter では 422 が使用されていました。これまで以上に混乱しています >.< 400 が含まれているので、400 の方が適していると考えている部分もありますが、 RFC doc では、422 はそうではありません。私は間違っているかもしれません。