REST APIのURL設計、その「美学」を紐解く:郵便配達で例える階層構造の極意
こんにちは。ネットワークの深淵を愛してやまない、インフラアーキテクトです。
今日は、Web APIの入り口である「URL設計」についてお話ししましょう。REST APIを設計する際、多くのエンジニアが「どうやってURLを作れば、誰が見ても分かりやすいのか?」と頭を抱えます。
教科書には難しい制約が並んでいますが、実はこれ、「郵便配達の仕組み」をイメージすると驚くほどスッキリ理解できるんです。一緒に紐解いていきましょう。
—
1. なぜURLには「階層」が必要なのか?
皆さんがネットで買い物をする時、AmazonなどのURLを眺めたことはありますか?
例えば、特定のユーザーの注文履歴を見たいとき、URLはこんな形をしているはずです。
/users/123/orders
これを見て、「なぜ users のあとに数字が来て、そのあとに orders が来るの?」と疑問に思ったことはありませんか? これは単なるルールではなく、「住所」そのものなんです。
郵便配達でイメージしてみる
手紙を届けるときを想像してください。
1. 都道府県(大きな括り)
2. 市区町村(中くらいの括り)
3. 番地(個人の特定)
この順番がバラバラだったら、郵便屋さんは混乱しますよね。「番地」が先に来て、「都道府県」が最後だと、日本全国を探し回る羽目になります。APIのURLも全く同じです。
/users/:「ユーザーというエリアへ行く」123:「その中の123番さんという家へ行く」/orders:「その家のポストに入っている注文リストを見る」
このように、「大きい括り → 小さい括り → 具体的な対象」という順番で並べることで、サーバー側も「ああ、これはユーザー123番の注文データのことね」と迷わず配達できるわけです。
—
2. パスパラメータで「個」を特定する
先ほどの /users/123/orders の 123 のような、状況に応じて変わる値のことを「パスパラメータ」と呼びます。
設計の現場では、以下のように記述するのが一般的です。
/users/{user_id}/orders
この {user_id} は、「ここには具体的なIDが入りますよ」というプレースホルダー(目印)です。
なぜこれが「美しい」のか?
もしこれを /get_user_orders?id=123 のように書いてしまうと、システムは「ユーザーを取得するのか、注文を取得するのか」という目的がURLから読み取りにくくなります。
パスパラメータを使うメリットは、「リソース(データの塊)が何であるか」が一目でわかることです。
- 悪い例:
/get_order_list?uid=123(何をするためのものか、動詞が含まれてしまっている) - 良い例:
/users/123/orders(ユーザー123の注文データ、という「モノ」が明確)
—
3. 実践!きれいなURLを設計してみよう
では、実際にAPIを設計する際のイメージをコードで見てみましょう。今回はPythonのフレームワーク(FastAPIなど)を想定した書き方です。
# ユーザーの特定リソースにアクセスする例
@app.get("/users/{user_id}/orders")
def get_user_orders(user_id: int):
# user_id を使ってデータベースから注文情報を検索する処理
# 郵便屋さんが「123番地の注文リスト」を探すようなイメージですね
return {"message": f"ユーザー{user_id}の注文リストをお届けします"}
このように設計しておくと、将来的に別のデータが増えても拡張が容易です。例えば、特定の注文詳細が見たくなった場合はどうでしょう?
/users/123/orders/456
はい、これで「ユーザー123の、注文456番」という住所が完成しました。このように、リソースの親子関係をパスの深さで表現するのがRESTの美しい設計手法です。
—
4. 初学者のための「設計のコツ」
最後に、現場で役立つ設計のポイントを3つだけお伝えします。
1. 動詞は入れない:URLは「住所(モノ)」を表すものです。create_user ではなく /users を使いましょう。操作(作成・取得・更新・削除)はHTTPメソッド(GET, POST, PUT, DELETE)が担当します。
2. 原則として複数形を使う:user ではなく users と複数形にするのが一般的です。その集合体の中の1つを指すときだけIDを添えます。
3. 深追いしすぎない:階層を深くしすぎると、URLが長すぎて管理が大変になります(例:/users/123/orders/456/items/789/details は長すぎます!)。3階層程度に留めるのが、現場では「読みやすい」とされています。
—
まとめ:ネットワークの深淵を歩くあなたへ
APIのURL設計は、ただの文字列の羅列ではありません。「クライアントとサーバー間のコミュニケーションを、どれだけスムーズにするか」という思いやりから生まれる地図なんです。
最初は難しく感じるかもしれませんが、まずは「これは郵便の住所なんだ」と意識してみてください。そうすれば、パケットがネットワークを駆け巡り、目的地に正しく届くまでの流れが、もっとクリアに見えてくるはずですよ。
それでは、また次回の深淵でお会いしましょう!
コメント