未分類

【API】対象の"リソース"がない場合のステータスコードについて【404 or 400 or 422】

APIのステータスコードについての話です。
今回は個人的な対応であり世間一般の統一された話ではないので、賛否両論ある話だと思います。

ステータスコードは状況により、何を返すかが決まっています。
しかしながら「リソースがない場合」については若干不明瞭だと感じています。
"Web"向けの仕様としては、リソースがない場合については404を返すとなっています。

では下記のリクエストで404が返ってきたとします。
GET api.example.com/item/1234

さてこれはどういった状況でしょうか。
itemに1234というものがない?
ではitem/1000だったら通る可能性がある?
しかし確認するとitemに1234は間違いなく存在します。
実は/item/という指定が間違っており/items/1234としなければならない状況でした。

こういったケースは往々にしてあると思います。
そのためAPIのURI指定が間違っている(存在しない)ケースである404と、
URI指定はあっているがリソースが存在しないケースは
ステータスコードを分ける方がAPIを呼び出す側からすると切り分けがしやすく楽だと感じます。

では何のステータスコードを返すのがいいでしょうか?
404以外を返したいとはいっても、独自ルールで返すのは余計にわかりにくく混乱を招きます。
候補としては400:Bad Requestと422:Unprocessable Entityが上がってきます。

APIのステータスコードのルールでは値のバリデーションエラー時に422を返すというのがあります。
また、存在しないリソースの指定はバリデーションエラーとみなすことができます。
実際、Laravelなどのフレームワークではバリデーションチェックのルールにリソースの存在判定があります。

400でもいいのですが、400は構文が無効というような意味合いになり、カバー範囲が広いです。

よって、個人的には、ルールに則りつつ開発時の問題切り分けがしやすい設計として
リソースが存在しない場合にAPIが返すステータスコードは422を推奨し、次点で400の利用になると考えます。

-未分類