はじめに
Webアプリのバックエンドを作る際、多くの場合「REST API」という形式でフロントエンドとやり取りするエンドポイントを設計します。ここでは、REST APIの基本的な考え方と、レスポンスとして返すHTTPステータスコードの使い分けを整理します。
REST APIとは
REST(Representational State Transfer) は、Webサービスを設計する際の1つの指針(アーキテクチャスタイル)です。「リソース(データの塊)を、標準化されたクライアント/サーバー間のやり取りを通じて操作する」という考え方が基本になっています。
実務上は、REST本来の制約を厳密にすべて満たしていなくても、HTTPを使ったAPI全般が慣習的に「REST API」「RESTfulなAPI」と呼ばれることが多く、初学者としてはまず次の2つの考え方を押さえておくと実践的です。
1. URLは「リソース」を表す
REST的な設計では、URLのパスは「操作」ではなく「対象となるデータ(リソース)」を表すのが基本です。
❌ /getRecipes (動詞を含んでいる)
✅ /recipes (リソース名の名詞)
❌ /deleteRecipe?id=1
✅ /recipes/1 (DELETEメソッドと組み合わせる)
2. 「何をするか」はHTTPメソッドで表す
「操作の種類」は、URLではなくHTTPメソッドで表現します。代表的な組み合わせは次の通りです。
| メソッド | 意味 | 例 |
|---|---|---|
GET |
リソースの取得 |
GET /recipes(一覧取得)、GET /recipes/1(詳細取得) |
POST |
リソースの新規作成 | POST /recipes |
PUT |
リソースの更新(全体の置き換え) | PUT /recipes/1 |
PATCH |
リソースの部分更新 | PATCH /recipes/1 |
DELETE |
リソースの削除 | DELETE /recipes/1 |
同じURL(/recipes/1)であっても、どのHTTPメソッドでアクセスするかによって意味が変わる、という点がポイントです。
HTTPステータスコードとは
HTTPステータスコードは、リクエストの処理結果をクライアントに伝えるための3桁の数値コードです。RFC 9110で定義されており、先頭の数字によって5つのクラスに分類されます。
| クラス | 意味 |
|---|---|
| 1xx | 情報(処理継続中であることの通知) |
| 2xx | 成功 |
| 3xx | リダイレクト(追加の操作が必要) |
| 4xx | クライアントエラー(リクエスト側に問題がある) |
| 5xx | サーバーエラー(サーバー側に問題がある) |
よく使う2xx(成功)
| コード | 意味 |
|---|---|
200 OK |
リクエストが成功した(最も一般的な成功レスポンス) |
201 Created |
リソースの新規作成に成功した(POSTの成功時によく使う) |
204 No Content |
成功したが、返す本文がない(DELETEの成功時によく使う) |
よく使う4xx(クライアントエラー)
| コード | 意味 |
|---|---|
400 Bad Request |
リクエストの形式が不正 |
401 Unauthorized |
認証されていない(ログインしていない、トークンが無効等) |
403 Forbidden |
認証はされているが、その操作を行う権限がない |
404 Not Found |
指定されたリソースが存在しない |
409 Conflict |
サーバー側の現在の状態と矛盾するリクエスト(例:既に他から参照されているデータの削除) |
422 Unprocessable Entity |
リクエストの形式は正しいが、内容がバリデーションルールに違反している |
401と403は混同しやすいですが、「誰であるか自体が確認できていない(未ログイン)」場合は401、「本人であることは確認できているが、その操作の権限がない」場合は403、という使い分けが基本です。
よく使う5xx(サーバーエラー)
| コード | 意味 |
|---|---|
500 Internal Server Error |
サーバー内部で予期しないエラーが発生した(汎用的なエラー) |
502 Bad Gateway |
リバースプロキシ等が、上流のサーバーから不正な応答を受け取った |
503 Service Unavailable |
サーバーが一時的に処理不能な状態(メンテナンス中、過負荷等) |
ステータスコードとレスポンスボディの役割分担
ステータスコードは「大まかな結果の種類」を伝える役割を持ちますが、「なぜ失敗したのか」「どのフィールドが問題だったのか」といった詳細な情報は、レスポンスボディ(JSON等)に含めるのが一般的です。
// 422のレスポンス例
{
"detail": [
{"loc": ["body", "email"], "msg": "value is not a valid email address"}
]
}
ステータスコードだけで判断せず、必要に応じてボディの内容も確認する、という設計がクライアント側にも求められます。
まとめ
| 概念 | 内容 |
|---|---|
| REST | URLをリソースとして捉え、操作はHTTPメソッドで表現する設計指針 |
| 2xx | 成功(200 OK、201 Created、204 No Content等) |
| 4xx | クライアント側の問題(400、401、403、404、409、422等) |
| 5xx | サーバー側の問題(500、502、503等) |
| 401 vs 403 | 未認証(401)か、認証済みだが権限がない(403)かの違い |