先日、WebAPIのバリデーションチェックエラー(必須チェック、桁数チェックなど)でレスポンスを返却する際、HTTPステータスとして何を返すのが適切かで議論となりました。
色々と調べて結論が出たので、せっかくなのでまとめて共有しようと思います。
議論メモ
返却ステータス案
- 200 OKを返す
- 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
Sending invalid fields will result in a 422 Unprocessable Entity response.
Twitter API
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)が適切かもしれません。