💭

Web API:リクエストしたデータが存在しないときのステータスコードは200?404?

2023/05/27に公開

はじめに

特定のカテゴリの質問項目をとってくる場合

  • GET /questions/category_id?=1 →カテゴリ1は存在する、質問項目は0件だった
  • GET /questions/category_id?=5 →カテゴリ自体存在しない

この2つのリクエスト結果のステータスコードは?
どちらも質問は存在しなかったので404?という疑問からのスタートです。

結論

結果だけ知りたい人はこちら

  • GET /questions/category_id?=1 →カテゴリ=1は存在する、質問項目は0件だった

こちらはカテゴリ=1は存在するので、リソースは存在しているので、200を返す

  • GET /questions/category_id?=5 →カテゴリ自体存在しない

カテゴリ自体存在しない=リソースが存在しないので404を返す

ステータスコードのおさらい

※ステータスコード:ここではHTTPステータスコードのことを指しています

https://developer.mozilla.org/ja/docs/Web/HTTP/Status

↑引用すると、

HTTPプロトコルにおいて通信の成否や処理状態を示すために使われるもの

ステータスコードを参照することで、処理状態やを把握し、表示の分岐を変更します
404でGoogleだとこういうやつよく見ますよね

ステータスコードの中で、タイトルにある200と400だけここで取り扱います。
成功レスポンス (200–299)の中で

200 OK
リクエストが成功したことを示します。成功が意味することは、 HTTP メソッドにより異なります。

https://developer.mozilla.org/ja/docs/Web/HTTP/Status/200

404 Not Found
サーバーがリクエストされたリソースを発見できないことを示します。

https://developer.mozilla.org/ja/docs/Web/HTTP/Status/404

単純に、リクエストしたデータがない=404なのでは?となるかもしれないのですが
リソースがないというのがミソです。

リソースとURI

https://learn.microsoft.com/ja-jp/azure/architecture/best-practices/api-design
↑から引用すると

REST API は "リソース" を中心に設計します。リソースは、クライアントがアクセスできるあらゆる種類のオブジェクト、データ、またはサービスです。
リソースには "識別子" があります。識別子は、そのリソースを一意に識別する URI です。

(REST APIについて記載すると長くなってしまうので省略)

URIを使ってリソースにアクセスします。
冒頭の

  • GET /questions/category_id?=1
  • GET /questions/category_id?=5

/questions/category_id?=** はURIの一部というわけです。

冒頭の疑問の答え

  • GET /questions/category_id?=1 →カテゴリ=1は存在する、質問項目は0件だった

こちらはカテゴリ=1は存在するので、
*リソースは存在しているので、200を返す

  • GET /questions/category_id?=5 →カテゴリ自体存在しない

カテゴリ自体存在しない=リソースが存在しないので404を返す

自分なりの結論

200なのか404なのかは、リソースの存在有無で分岐させる
存在する場合:200
存在しない場合:404 だという結論がしっくりきました。

参考文献

https://developer.mozilla.org/ja/docs/Web/HTTP/Status
https://learn.microsoft.com/ja-jp/azure/architecture/best-practices/api-design

LiB Consulting

Discussion