RESTとルート設計
「機能が増えると REST では足りなくなる」という話をよく聞きます。
このガイドの設計方針に従うと、ルートは比較的シンプルに保てるのではないか、という考えを書いておきます。
ルートが増える傾向
Section titled “ルートが増える傾向”ルートが増えるのは、画面が増えることと関係していることが多いです。
# 画面ごとにルートを作ると...
GET /users/new 新規登録画面POST /users/new/confirm 確認画面へGET /users/new/confirm 確認画面POST /users/new/back 入力に戻るPOST /users/new/submit 登録実行GET /users/new/complete 完了画面1つの「ユーザー作成」に 6ルート。こういうケースは珍しくありません。
この設計方針との関係
Section titled “この設計方針との関係”| このガイドの方針 | 減る可能性のあるルート |
|---|---|
| 確認画面を減らす | /confirm, /back, /complete |
| 登録画面を統合する | /new 系 |
| 編集画面を統合する | /edit 系 |
画面が減れば、ルートも減る傾向にあります。
REST の基本形
Section titled “REST の基本形”参考として、REST の基本形は以下の5つ。
GET /users 一覧GET /users/:id 詳細POST /users 作成PUT /users/:id 更新DELETE /users/:id 削除このガイドの設計方針に従うと、この基本形に近づきやすいのではないかと考えています。
状態遷移の操作
Section titled “状態遷移の操作”業務システムでは、CRUD だけでは足りないことが多いです。
POST /orders/:id/submit 申請POST /orders/:id/approve 承認POST /orders/:id/reject 却下POST /orders/:id/cancel 取消これらは業務上必要な操作であり、REST の基本形とは別に存在して構いません。
リソース中心とアクション中心
Section titled “リソース中心とアクション中心”両方のアプローチがあり、混在しても問題ありません。
# リソース中心(CRUD)GET /orders/:idPUT /orders/:idDELETE /orders/:id
# アクション中心(業務操作)POST /orders/:id/submitPOST /orders/:id/approve重要なのは、URL を見れば何をするか分かる こと。
命名の一貫性
Section titled “命名の一貫性”# 推奨: リソース + 動詞POST /orders/:id/submitPOST /orders/:id/approvePOST /orders/:id/ship
# 避けたい: リソースが見えないPOST /submitOrder/:idPOST /doApproval
# 避けたい: 何をするか分からないPUT /orders/:id/statusPATCH /orders/:idルート数の内訳を見る
Section titled “ルート数の内訳を見る”ルートの数だけでなく、何のルートか を見ることが大切。
健全な例(8ルート)
Section titled “健全な例(8ルート)”# CRUD: 5ルート(基本形)GET /ordersGET /orders/:idPOST /ordersPUT /orders/:idDELETE /orders/:id
# 状態遷移: 3ルート(業務上必要)POST /orders/:id/submitPOST /orders/:id/approvePOST /orders/:id/cancel業務に必要な操作がルートになっています。
見直したい例(11ルート)
Section titled “見直したい例(11ルート)”# CRUD: 5ルートGET /ordersGET /orders/:idPOST /ordersPUT /orders/:idDELETE /orders/:id
# 確認画面系: 4ルートPOST /orders/confirmGET /orders/confirmPOST /orders/backGET /orders/complete
# 状態遷移: 2ルートPOST /orders/:id/submitPOST /orders/:id/approveUI の工程(確認、戻る、完了)がルートになっています。
逆に考えると
Section titled “逆に考えると”「REST で収まらない」という状況が頻発するなら、それは設計を見直すきっかけかもしれません。
| こういうルートが多いなら | 確認すること |
|---|---|
/confirm, /back, /complete | UI の工程がルートになっていないか |
/new と /edit が別々 | 画面を分けすぎていないか |
| 1リソースに15ルート以上 | リソースを分割すべきかもしれない |
ただし、ルート数が多いこと自体は問題ではありません。業務上必要な操作であれば、10ルートでも意図が明確なら保守しやすいです。
REST に縛られすぎない
Section titled “REST に縛られすぎない”REST は便利な共通言語ですが、目的ではありません。
注意したいこと
Section titled “注意したいこと”- 無理に CRUD に押し込めると、リクエストボディが肥大化します
PUT /orders/:idで全部やろうとすると、何が変わるか分からなくなります- 「RESTful かどうか」より「使いやすいかどうか」が大切です
業務の言葉を使う
Section titled “業務の言葉を使う”業務システムには業務の言葉があります。
# 業務の言葉をそのまま使うPOST /orders/:id/submit # 申請POST /orders/:id/approve # 承認POST /orders/:id/reject # 却下
# 無理に CRUD に押し込めないPUT /orders/:id { status: 'approved' } # 何をしているか分かりにくい申請、承認、却下。これらを無理に CRUD に押し込める必要はありません。
チェックリスト
Section titled “チェックリスト”- リソース名が名詞(
/users,/orders) - 1リソースあたり 5〜10 ルート
- URL を見れば何をするか分かる
- 業務の言葉がルート名に使われている
/confirm,/back,/completeが多い → UI の工程がルートになっている/doSomethingのような動詞だけの URL → リソースに紐づいていない- 1リソースに 15 ルート以上 → リソースの分割を検討
このガイドが言いたいのは「REST の基本形に収めろ」ということではありません。
- UI の工程(確認画面、完了画面)がルートになっているなら、UI を見直す余地がある
- 業務上必要な操作(申請、承認)がルートになっているなら、それは健全
ルート設計の複雑さを感じたら、何が原因で複雑になっているか を見分けることが大切です。