はじめに
本記事はWebアプリケーションのURL設計に関する包括的なガイドです。日常的に使うAPIやWebページのURLを、利用者にも開発者にも分かりやすく保守しやすくするための考え方を丁寧に解説します。
対象はフロントエンド・バックエンドの開発者、設計担当者、あるいはこれからAPI設計を学ぶ方です。専門用語は最小限に抑え、具体例を交えて説明します。
主に扱う内容:
– リソース中心の命名とHTTPメソッドの基本(例:GET /users
, POST /products
)
– 階層構造とID表現(例:/shops/12/products/34
)
– 拡張性と後方互換性を保つ工夫
– SEOやユーザビリティを意識したURLの書き方
– フィルタリング・ソート・ページネーションのクエリ設計
– 具体的な良い例・悪い例と実装時の注意点
以降の章で順に詳しく説明します。まずは基本の考え方を押さえ、実際の設計にすぐ活かせる知識をお届けします。
REST APIのURL設計原則と命名規則
はじめに
URLは「何の情報を扱うか」を示す住所です。読みやすく、予測しやすい名前にすると開発者や利用者が扱いやすくなります。
基本原則
- 名詞で表現する:リソースを表す具体的な名詞を使います(例:/users)。
- 動詞は使わない:操作はHTTPメソッドで表現します(GET, POST, PUT, DELETE)。
命名規則(具体例付き)
- 複数形を基本に:/users, /orders のように統一します。
- 小文字とハイフン:user-profiles のように読みやすくします。アンダースコアは避けます。
- 拡張子を付けない:/users.json のような拡張子は不要です。
リソース階層の表現
親子関係はスラッシュで表現します。例:/users/123/posts はユーザー123の投稿を示します。IDはパスパラメータで扱います。
HTTPメソッドとの関係
- GET /users → ユーザー一覧取得
- GET /users/123 → ユーザー123取得
- POST /users → ユーザー作成
- PUT/PATCH /users/123 → 更新
- DELETE /users/123 → 削除
バージョニングと互換性
APIの変更はバージョンで管理します(例:/v1/users)。URL変更で互換性を壊さないよう注意します。
よくある間違いと注意点
- 動詞を入れる(/getUsers)は避ける。
- リソースと操作を混在させない。
- 命名ルールの一貫性を保つ。
具体例:良い例 /v1/users/123/posts。悪い例 /get_user_posts?id=123。
拡張性とユーザビリティを意識したURL設計
はじめに
拡張性と使いやすさを両立させるURLは、長期運用で重要です。ここでは実務で使える考え方と具体例をわかりやすく説明します。
1. バージョン管理をURLに含める
APIであることが分かるように先頭に/apiを置き、その後にバージョンを入れます。例: /api/v1/users
この方法で互換性を保ちつつ新機能を追加できます。バージョンアップ時は新しいパスを作り、古いパスは段階的に廃止します。
2. リソース構造を明確にする
リソース間の関係はネストで表現しますが、深すぎないようにします。例: /api/v1/users/123/orders/456
ネストは親子関係を示すときに限定し、検索やフィルタはクエリに任せます。
3. ユーザビリティ向上の工夫
- 読みやすいスラッグを使う(/articles/2025-09-title-exampleではなく/articles/how-to-design)
- 小文字・ハイフンで統一する
- IDのみのURLは内部向けに限定し、公開ページは説明的なパスにする
- パス構造がナビゲーションになるよう分類を反映する
4. 拡張性を考えた命名と運用
- 複数形を基本にする(/users, /products)
- 将来の機能を見越して余裕を持ったネームスペースを設計する
- 廃止時はHTTPステータスとリダイレクトで通知する
実践例
良い例: /api/v1/users/123/orders?status=shipped
悪い例: /getUserOrders?id=123&status=shipped
各項目は運用チームと合意し、ドキュメントで一貫性を保ってください。
SEO観点でのURL設計
概要
検索エンジンで評価されやすいURLは「短く・分かりやすく・安定」しています。キーワードを含めると検索意図と一致しやすく、クリック率も上がります。
キーワードと区切り方
- キーワードは自然な語順で入れ、単語間はハイフン(-)で区切ります。例: /products/blue-sneakers
- アンダースコアやスペースは避け、小文字を使うと管理しやすいです。
日本語URLの扱い方
- 日本語URLはユーザーに親切に見えますが、ブラウザやシステムで%エンコーディングされ長くなることがあります。短く保てる場合は使えますが、多くはローマ字や英語スラッグを推奨します。
内部リンクと回遊性
- サイト内のリンクは説明的なアンカーテキストにし、階層構造を反映させます。パンくずやカテゴリごとの一覧ページを用意するとクローラーとユーザー両方が回遊しやすくなります。
実例(良い/悪い)
- 良い: /articles/vegan-muffin-recipe
- 悪い: /article?id=345&ref=top
注意点
- キーワードの詰め込みは避け、URLは長期間変えないこと。変更する際は301リダイレクトで恒久的に移動を示してください。
フィルタリング・ソート・クエリパラメータ設計
概要
検索や絞り込みにはクエリパラメータを使います。例: /posts?author=123&sort=created_at。名前は統一し、利用者が迷わない設計を心がけます。
命名規則
- 単純なフィルタ: author, status, category
- IDは末尾に “_id” を付ける (例: author_id)
- 検索語は q を使うと短く分かりやすい
ソート設計
- sort=created_at または sort=-created_at(先頭に-で降順)
- 複数項目はカンマ区切り: sort=priority,-created_at
値の形式と型
- 日付は ISO 8601 (例: 2023-05-10)
- 範囲は from/to または created_from/created_to
- 真偽は true/false を使う
複数値・配列
- 同じパラメータを複数回渡す: tag=tech&tag=api
- またはカンマ区切り: tags=tech,api
ページングとの併用
- page & per_page、または limit & offset のどちらかに統一します
実践例
/posts?author_id=123&status=published&tags=tech,api&sort=-created_at&page=2&per_page=20
注意点
- 不明なパラメータは無視するか明確なエラーを返す
- ドキュメントで必須・任意、デフォルトを明記してください。
具体的な良い例・悪い例
基本ルール
- 複数形の名詞をパスに使う(リソースは名詞中心)
- 動詞をエンドポイントに含めない(操作はHTTPメソッドで表す)
- 階層で関係を表現する(親子リソースは/parent/{id}/child)
- 小文字とハイフン・アンダースコアは統一
良い例
- GET /users
- ユーザー一覧を取得します。
- POST /users
- 新しいユーザーを作成します。
- GET /users/123/posts
- ユーザー123の投稿一覧を取得します。
- GET /products/45/reviews?page=2&sort=rating
- 製品45のレビューをページング・ソート付きで取得します。
悪い例
- GET /getUsers
- 動詞が混在し可読性が低くなります。
- POST /createUser
- 動詞で操作と資源が混ざっています。
- GET /getUserPosts/123
- IDの位置が不自然で階層表現になっていません。
解説ポイント
- IDはパスの一部に置き、リソースの階層を明確にします。
- フィルタやページはクエリパラメータに任せます。
- 小文字で統一すると運用が楽になります。
実装時の注意点・まとめ
実装前のチェックリスト
- 仕様書を最新版に揃えます。変更点は明記して通知します。
- URLの互換性を確認します。既存クライアントを壊さない設計を優先します。
バージョニングと互換性
- パス(例: /v1/)かヘッダーでバージョン管理します。公開APIはパス方式が分かりやすいです。
- 新機能は新バージョンで導入し、移行期間と非推奨通知を設けます。
エラーハンドリングとステータス
- 標準的なHTTPステータスを使います(200/201/400/404/500など)。
- エラー時は機械判別しやすいJSON(code, message, details, docs)を返します。
キャッシュとパフォーマンス
- Cache-ControlやETagでキャッシュ制御します。大きな一覧はページングやストリーミングで分割します。
セキュリティ
- 常にHTTPSを使います。認証情報はAuthorizationヘッダーで渡し、クエリに秘密情報を置きません。
テスト・ドキュメント・運用
- OpenAPIなどで仕様を記述し、自動生成テストを用意します。ログとメトリクスで問題を早期に検知します。
最後に一言:URLは設計の顔です。何を表すのか一目で分かるようにし、将来の変更に耐えられる柔軟さと丁寧なドキュメントを大切にしてください。