ウェブエンジニア問題集

API設計の基本 — RESTfulなエンドポイントの設計ルール

フロントエンドとバックエンドをつなぐAPIは、チーム開発において最も重要なインターフェースです。 API設計が雑だと、フロントエンド側が個別対応に追われ、バックエンド側も一貫性のないコードになります。

この章では、RESTfulなAPI設計のルールと、実務で迷いやすいポイントを整理します。

学習者学習者

APIのURLって自由に決めていいの?チームで作るとバラバラになりがち…ルールってあるの?

RESTの基本原則

REST(Representational State Transfer)は「リソース」を中心に考える設計スタイルです。

原則説明
リソース指向URLはリソース(名詞)を表し、動詞は使わない
HTTPメソッドで操作を表現GET=取得, POST=作成, PUT/PATCH=更新, DELETE=削除
ステートレスリクエスト単体で処理が完結する(サーバーにセッション状態を持たせない)
⭕ /api/users/123        — ユーザーというリソース
❌ /api/getUser?id=123   — 動詞が入っている
❌ /api/deleteUser/123   — 操作がURLに含まれている

HTTPメソッドの使い分け

メソッド操作べき等性
GET取得ありGET /api/products
POST作成なしPOST /api/products
PUT全体更新ありPUT /api/products/123
PATCH部分更新ありPATCH /api/products/123
DELETE削除ありDELETE /api/products/123

以下のセクションは現在執筆中です。

  • レスポンス形式の統一(エンベロープパターン)
  • ページネーション設計(cursor vs offset)
  • バージョニング戦略(URL vs ヘッダー)

ステータスコードの選び方

APIを利用する開発者がエラーハンドリングを正しく実装するには、ステータスコードが一貫したルールで返されている必要があります。

ステータスコード意味使いどころ
200 OK成功(データ返却あり)GET、PATCH成功時
201 Createdリソース作成成功POST成功時
204 No Content成功(データ返却なし)DELETE成功時
400 Bad Requestリクエストの形式が不正バリデーションエラー
401 Unauthorized認証が必要トークン未指定・期限切れ
403 Forbidden権限がないロール不足
404 Not Foundリソースが存在しない存在しないID指定
409 Conflict競合が発生重複登録、楽観ロック衝突
422 Unprocessable Entity形式は正しいが処理不能ビジネスルール違反
500 Internal Server Errorサーバー内部エラー予期しない例外

エラーレスポンスの形式もプロジェクト全体で統一しておくと、フロントエンド側が共通のエラーハンドリングを組めます。

{
  "error": {
    "code": "USER_NOT_FOUND",
    "message": "指定されたIDのユーザーが存在しません",
    "details": []
  }
}

APIリファレンスの書き方

APIリファレンスは「開発者がAPIを使うときに最初に見るドキュメント」です。 書き方が悪いと、利用者はソースコードを読むか、試行錯誤するしかなくなります。

リソースとは

REST APIにおけるリソースとは、APIが扱うデータの単位です。 たとえばECサイトなら「ユーザー」「商品」「注文」「カート」がリソースにあたります。

各リソースには対応するエンドポイント(URL)があり、HTTPメソッドで操作を表現します。

リソース: ユーザー(users)
├── GET    /api/users          → ユーザー一覧を取得
├── POST   /api/users          → ユーザーを新規作成
├── GET    /api/users/:id      → 特定のユーザーを取得
├── PATCH  /api/users/:id      → ユーザー情報を更新
└── DELETE /api/users/:id      → ユーザーを削除

APIリファレンスに含めるべき項目

網羅的なAPIリファレンスには、以下の情報がすべてのエンドポイントに対して記載されています。

項目説明
エンドポイントリソースのURLGET /api/users/:id
メソッドHTTPメソッドGET, POST, PATCH, DELETE
パラメータパス・クエリ・ボディの入力値:id(パス), ?page=2(クエリ)
リクエスト例実際のリクエストボディJSONの具体的な値
レスポンス例成功時のレスポンスボディJSONの具体的な値
ステータスコード成功・エラー時のHTTPステータス200, 201, 400, 404
エラーメッセージエラー時のレスポンス形式エラーコードと説明文

実際のリファレンス例

APIリファレンスを確認する開発者

以下は1つのエンドポイントに対する記述例です。このレベルで書かれていれば、利用者はソースコードを読まずにAPIを使えます。

## ユーザー取得

指定されたIDのユーザー情報を返します。

### エンドポイント

GET /api/users/:id

### パラメータ

| パラメータ | 位置 | 型 | 必須 | 説明 |
|---|---|---|---|---|
| id | パス | integer | はい | ユーザーID |

### リクエスト例

  GET /api/users/42
  Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

### レスポンス例(200 OK)

  {
    "id": 42,
    "name": "田中太郎",
    "email": "tanaka@example.com",
    "role": "editor",
    "created_at": "2025-03-01T09:00:00Z"
  }

### エラーレスポンス

| ステータス | エラーコード | 説明 |
|---|---|---|
| 401 | UNAUTHORIZED | 認証トークンが無効または未指定 |
| 403 | FORBIDDEN | このユーザー情報へのアクセス権がない |
| 404 | USER_NOT_FOUND | 指定されたIDのユーザーが存在しない |
学習者学習者

APIリファレンスって全部手で書くの?エンドポイントが増えるたびにメンテするの大変そう…

先生先生

実務ではOpenAPI(Swagger)でスキーマを定義して、リファレンスを自動生成するのが主流だよ。でも自動生成する場合でも「何を書くべきか」を知っていないと、中身のないリファレンスが量産されるだけだからね。

ちゃんと使うためのポイント

  • URLはリソース(名詞)で構成し、操作はHTTPメソッドで表現する
  • レスポンス形式はプロジェクト全体で統一する
  • ステータスコードを正しく使い分けることで、フロントエンド側の分岐がシンプルになる
  • APIリファレンスにはエンドポイント・パラメータ・リクエスト例・レスポンス例・ステータスコード・エラーメッセージを網羅する
  • 迷ったらHTTP仕様に立ち返る

次の章では、API設計の前提となるURL設計とルーティングを掘り下げます。