Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

先日、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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away