api
HTTP
REST-API

WebAPIでバリデーションチェックエラーの際、HTTPステータスは何を返すのが適切か

先日、WebAPIのバリデーションチェックエラー(必須チェック、桁数チェックなど)でレスポンスを返却する際、HTTPステータスとして何を返すのが適切かで議論となりました。
色々と調べて結論が出たので、せっかくなのでまとめて共有しようと思います。

議論メモ

返却ステータス案

  1. 200 OKを返す
  2. 400 Bad Requestを返す

その時出た意見

  • エラーだからOKを返すのも気持ち悪いよね
  • 400系は404 Not Foundなどと同じ粒度のエラーで使うべきだよね

などいろいろ出たのですが、これだという結論が出なかったため調べてみました。

Teratail

最初に、Teratailに質問を投稿してみました。
https://teratail.com/questions/95217

XHR等で結果を取得する場合、ステータスコード200は正常に取得できた(success)と判断して処理をする記述をされる方が多いように感じますので400系を返すのがよいのではないかと考えます。

teratail APIは容赦なく400 Bad Requestになりますね。
他の実装でも、パラメータ不足等はBad Requestになることが多いかと思います。
エンドポイントが異なる場合等で404が返ることもあります。

上記のようなコメントを頂き、他のAPI仕様を確認してみました。(suyamaさん、コメントありがとうございました!)

GitHub API

https://developer.github.com/v3/

Sending invalid fields will result in a 422 Unprocessable Entity response.

Twitter API

https://developer.twitter.com/en/docs/ads/general/guides/response-codes

400 INVALID_PARAMETER

StackOverFlow

StackOverFlowでも同じような質問を見つけました(最初から検索すればよかった、、)
https://stackoverflow.com/questions/6123425/rest-response-code-for-invalid-data

400 is the best choice in both cases. If you want to further clarify the error you can either change the Reason Phrase or include a body to explain the error.
412 - Precondition failed is used for conditional requests when using last-modified date and ETags.
403 - Forbidden is used when the server wishes to prevent access to a resource.
The only other choice that is possible is 422 - Unprocessable entity.

結論:400(Bad Request)を返却するのがよさそう

上記の通り色々と調べた結果、やはり400(Bad Request)を返却するのが良さそうでした。
より詳細に返却するのであれば、GitHubのように422(Unprocessable Entity)が適切かもしれません。

参考:HTTPステータスコード - Wikipedia