使いやすい API は、それだけで開発体験を大きく左右します。RESTful API の設計には確立された原則があり、押さえるだけで一貫性と保守性が段違いになります。実務で効く基本を整理しました。
REST は Web の仕組みに沿って API を設計する考え方です。「データ(リソース)」を URL で表し、それに対する操作を HTTP メソッドで表現します。ルールがシンプルなので、初見の開発者でも直感的に使えるのが強みです。
URL に動詞を入れず、対象となるモノを名詞・複数形で表現します。
❌ /getUsers /createUser /deleteUser
✅ GET /users # 一覧取得
✅ GET /users/1 # 個別取得
✅ POST /users # 作成
✅ PUT /users/1 # 更新
✅ DELETE /users/1 # 削除
「何をするか」は URL ではなく HTTP メソッドが担います。
GET /users/1/orders(ユーザー1の注文一覧)。ただし2階層までに抑える。/order-items。/orderItemsや/order_itemsは避ける。/users に一本化。/search のようなサブリソースにする。PUT と PATCH の違い:PUT はリソース全体を置き換える(送らなかった項目は消える想定)、PATCH は送った項目だけ部分更新します。
同じリクエストを何回送っても結果が変わらない性質を冪等といいます。GET・PUT・DELETE は冪等、POST は非冪等です。決済など「二重実行されると困る」POSTには、クライアントが生成した Idempotency-Key ヘッダーを受け取り、同じキーの再送は最初の結果を返す設計にします。
レスポンスの成否は HTTP ステータスコードで表現します。ボディだけで判断させる設計は避けましょう。
200 OK # 成功
201 Created # 作成成功
400 Bad Request # リクエストが不正
401 Unauthorized# 認証が必要
404 Not Found # リソースが存在しない
500 Server Error# サーバー側の異常
エラー時も一貫した JSON 形式で、原因が分かる情報を返します。
{
"error": {
"code": "VALIDATION_ERROR",
"message": "メールアドレスの形式が正しくありません",
"field": "email"
}
}
API は一度公開すると簡単には変えられません。URL にバージョンを含め、破壊的変更に備えます。
/v1/users
/v2/users
データ量が増えても破綻しないよう、一覧エンドポイントには最初から絞り込み用パラメータを用意します。専用の検索エンドポイントを作るより一貫します。
GET /users?status=active&role=admin # フィルタ
GET /users?sort=-created_at # ソート(-は降順)
GET /users?page=2&limit=20 # ページネーション
GET /users?q=tanaka # キーワード検索
レスポンスには合計件数や次ページの有無も含めます。
{
"data": [ /* ... */ ],
"meta": { "page": 2, "limit": 20, "total": 137 }
}
APIキーやトークンはURLやクエリに入れず、Authorization: Bearer <token> ヘッダーで渡します。ユーザー認可が必要なら OAuth 2.0 / OIDC、サーバー間ならAPIキーやクライアントクレデンシャルが一般的です。認証エラーは 401(未認証)、権限不足は 403(認証済みだが不許可)と使い分けます。
429 Too Many Requests と Retry-After を返す。422 または 400 で返す。エンドポイントが素直に決まり、CDNやHTTPキャッシュを効かせたいなら REST。画面ごとに必要な項目が大きく異なり、過剰取得・N+1リクエストを減らしたいなら GraphQL が向きます。多くの業務APIはRESTで十分です。
パスはケバブケース(ハイフン)。クエリやJSONのキーは snake_case か camelCase をAPI全体で統一します。
PUTは全体置き換え(冪等)、PATCHは部分更新です。
一覧エンドポイントにGETのクエリパラメータを足します。例: GET /users?status=active&sort=-created_at&page=2。
良い API 設計の核心は「一貫性」と「予測可能性」です。リソース指向の URL、正しいメソッドとステータスコード、統一されたレスポンスとエラー、ヘッダー経由の認証——この基本を守るだけで、使う人にも保守する人にも優しい API になります。