コンテンツにスキップ

REST API設計でよくある間違い:PUT/PATCH・ステータスコード・命名規則

概要

「ほとんどの API は REST ではなく、ただの HTTP エンドポイントだ」という指摘から始まる、実務でよく見る REST API 設計ミスの解説。

詳細

間違い 1:PUT を PATCH の代わりに使う

# 悪い例: ユーザーのメールだけ更新したいのに PUT を使う
PUT /users/123
{
  "name": "Taro",       ← 変えるつもりがないのに全フィールドが必要
  "email": "new@example.com",
  "role": "admin"
}

# 正しい: 部分更新には PATCH
PATCH /users/123
{
  "email": "new@example.com"   ← 変えたいフィールドだけ
}

ルール: - PUT = リソース全体を置き換える(全フィールド必須) - PATCH = 一部フィールドだけ更新する

間違い 2:HTTP ステータスコードを無視する

# 悪い例: 全部 200 で返す
HTTP/1.1 200 OK
{ "error": "User not found" }  ← エラーなのに 200?

# 正しい
HTTP/1.1 404 Not Found
{ "message": "User not found", "code": "USER_NOT_FOUND" }

よく使うステータスコード:

200 OK           → 正常レスポンス(GET・PUT・PATCH 成功)
201 Created      → リソース作成成功(POST)
204 No Content   → 削除成功(DELETE)
400 Bad Request  → リクエストの形式が不正
401 Unauthorized → 認証が必要
403 Forbidden    → 権限なし(認証済みだが操作不可)
404 Not Found    → リソースが存在しない
409 Conflict     → 競合(重複など)
422 Unprocessable → バリデーションエラー
429 Too Many Requests → レートリミット超過
500 Internal Server Error → サーバーエラー

間違い 3:命名規則が REST らしくない

# 悪い例(動詞 + リソース名)
GET /getUserData
POST /createUser
DELETE /deleteUser/123
GET /api/getActiveOrders

# 正しい(名詞のリソースに HTTP メソッドで動作を表現)
GET    /users/123
POST   /users
DELETE /users/123
GET    /orders?status=active   ← フィルタはクエリパラメータ

間違い 4:バージョニングをしない

# バージョニングなし → 破壊的変更を出せない
GET /users/123

# バージョニングあり → v1 を壊さずに v2 で変更可能
GET /api/v1/users/123
GET /api/v2/users/123

なぜ重要か / いつ使うか

  • 新しい API を設計するとき
  • コードレビューで API 設計をチェックするとき
  • 面接で「REST API の設計について」聞かれたとき