🌸

意味の分かるURLを設計したい

2024/09/21に公開

APIも画面も使う人のために設計するので、使う人が読みやすいものにしたいですね。

意味のあるリソース名を使用する

リソース名を具体的にしておくことで、API利用者は対象が何なのか直感的に理解できます。

良い例

このエンドポイントは「桜高校の2年3組の25番目の生徒」に関するリソースを明確に示しています。学校名、学年、クラス、生徒番号が具体的で、何が対象なのか一目で分かります。

/schools/sakura/grades/2/classes/3/students/25

悪い例

動詞「get」を使っており、リソースが何であるかが明確でありません。対象の学校や学年などもはっきりせず、理解が難しい構造です。

/getSchoolGradeClassStudent

階層構造を反映する

階層構造はリソースの関係性を直感的に示し、APIの読みやすさや操作性を高めます。階層がないと、リソースの関係性が分かりにくくなり、混乱を招きやすくなります。

良い例

このエンドポイントでは「桜高校」の「2年生」「3組」「25番目の生徒」というリソース間の親子関係が明確に階層構造で表現されています。利用者はリソースの関係性をすぐに理解できます。

/schools/sakura/grades/2/classes/3/students/25

悪い例

クエリパラメータを使用してリソースを表現しており、リソース間の親子関係が不明確です。階層的な依存関係が視覚的に表現されていないため、APIの理解が難しくなります。

/students?school=sakura&grade=2&class=3&student=25

動詞ではなくHTTPメソッドを使用する

RESTful APIの設計では、操作はHTTPメソッド(GET, POST, PUT, DELETEなど)で表現し、エンドポイント名にはリソースのみを使用することで、簡潔で理解しやすい設計ができます。

良い例

HTTPメソッド「GET」が生徒の情報取得を表し、エンドポイントはリソースに集中しています。エンドポイント名に動詞を使わないことで、シンプルかつわかりやすい構造になっています。

GET /schools/sakura/grades/2/classes/3/students/25

悪い例

エンドポイント名に「get」という動詞が含まれており、HTTPメソッドの「GET」と冗長になります。リソース名が不明確で、操作内容がエンドポイントに混ざっています。

/getStudentInfo

シンプルなパラメータを使用する

パラメータはシンプルで、必要な情報のみを短く記述することで、エンドポイントの可読性とメンテナンス性が向上します。複雑なクエリパラメータは理解しづらく、エラーの元となります。

良い例

メインのリソースは階層構造で示され、追加のフィルタリング情報(例えば生徒のステータス)はクエリパラメータでシンプルに指定されています。

/schools/sakura/grades/2/classes/3/students/25?status=active

悪い例

複数のクエリパラメータでリソースを指定しており、複雑で読みにくい設計です。リソースの階層関係も明確でなく、クライアントに負担がかかります。

/students?id=25&school_name=sakura&class_year=2&class_name=3&status=active

一貫性を保つ

一貫性のある命名と構造を保つことで、APIを使う際の学習コストを削減し、予測可能な設計が可能になります。ルールが一貫していないと、混乱を招き、保守もしにくくなります。

良い例

「学校」「学年」「クラス」「生徒」や「教師」というリソースが一貫して階層構造を使い、同じ命名パターンで統一されています。これにより、エンドポイントの予測が容易です。

/schools/sakura/grades/2/classes/3/students/25
/schools/sakura/grades/2/classes/3/teachers/5

悪い例

命名規則がバラバラで、リソースの表現方法に一貫性がありません。利用者は新しいエンドポイントを理解する際、毎回新しいパターンを学ぶ必要があり、学習コストが増えます。

/schools/sakura/classes/grade-2-3/students/25
/teachers-of-class-3/sakura/grade-2/teacher-5

Discussion