イベントがあり、そのイベントにメンバーを追加したいとします。それをevent/:event-id/members/
として設計しますか?または、単に'/members'
にして、POST body?
ネストされたエンティティの処理。例えば。イベントにはミニイベントがあり、そのミニイベントにメンバーを追加したいとします。繰り返しますが、event/:event-id/mini-event/:mini-event-id/members/
のようになりますか?
したがって、上記の例で、そのミニイベントに追加されたメンバー1に変更を加えたい場合は、event/:event-id/mini-event/:mini-event-id/members/:member-id
のようにアクセスする必要があります。これは、3レベルのネストであるため、私にはあまり適切ではないようです。
もちろん、私はこれを行うための最もRESTful方法を知りたいです。一般的な考え方は、データベースエンティティをモデル化する方法でAPIを設計することですか(ミニイベントは、それらが含まれるイベントの主キーを参照し、上記の例ではユーザーの主キーも参照します)、または独立している必要があります
これはユースケースに主観的なものであるため、これについては意見が分かれます。ここで正解はありません。理想的には、ユースケースに最適なAPIを設計します。
event/:event-id/members
対/members
自分に問う質問:「メンバー」リソースは独立していますか?例えば:
イベント間でメンバーをフェッチする必要がありますか(たとえば、分析の実行)?私はいつでも/members
を取得し、クエリパラメータとしてevent-id
でフィルタリングできます。
POST event/:id/members
やGET /members/:id
などのように、よりクリーンな使用法をサポートするために複数のエンドポイントを追加しますか?
あなたが言及した方法(3レベル)でのネストは、上記と同じ理由でうまく拡張できないことがわかりました-今日、ミニイベントでメンバーをネストしています。明日、イベント全体でメンバーにアクセスする必要がある場合(例として分析)、エンドポイントを複製する必要があります。ルートレベルの場合も、パラメータを追加するだけです。
あなたのケースでは、メンバーがイベントとミニイベントの両方に属することができる場合、すでに複数のエンドポイントを持っています。それを避けてください、それはドキュメンテーションを難しくします。
PATCH event/:event-id/mini-event/:mini-event-id/members/:member-id
のようなものは避けてください。 PATCH members/:id
は扱いが簡単です
結論として、これがあなたができることです。クエリパラメータで/members/
および/mini-events/
にGETを使用します。 /events/:event-id/members/:member-id
および/events/: event-id/mini-events/:mini-event-id
のPOST、PUT、PATCHおよびDELETE。
関連する読み https://martinfowler.com/articles/richardsonMaturityModel.html
RESTエンドポイントは、必ずしもデータベーススキーマと何の関係もありません。少なくともdependに関係するべきではありません。結局、エンドポイントは、データベースに直接関連付けられていません。
あなたの例を考えると、GET /event/:eventid/members
はイベントのすべてのメンバーをフェッチするため、メンバーを追加すると同じエンドポイントが使用されると思います。確かに、/members
を呼び出してイベントIDをパラメーターとして渡すよりも、はるかにRESTfulです。それは、フォームベースのWebページスタイルのことです。
2番目の例については、状況によって異なります。親子関係のあるミニイベントを定期的に開催することもできます。次に、1レベルのネストを取り除き、:mini-event-id
が実際に:event-id
の一部であることを確認する必要がありません。例えば。 /event/:eventid/mini-events/
は、イベントに関連するすべてのミニイベントを一覧表示しますが、/event/:mini-event-id
を介して引き続きアクセスできます。