web-dev-qa-db-ja.com

ネストされたAPI-グッドプラクティスディスカッション

  1. イベントがあり、そのイベントにメンバーを追加したいとします。それをevent/:event-id/members/として設計しますか?または、単に'/members'にして、POST body?

  2. ネストされたエンティティの処理。例えば。イベントにはミニイベントがあり、そのミニイベントにメンバーを追加したいとします。繰り返しますが、event/:event-id/mini-event/:mini-event-id/members/のようになりますか?

したがって、上記の例で、そのミニイベントに追加されたメンバー1に変更を加えたい場合は、event/:event-id/mini-event/:mini-event-id/members/:member-idのようにアクセスする必要があります。これは、3レベルのネストであるため、私にはあまり適切ではないようです。

もちろん、私はこれを行うための最もRESTful方法を知りたいです。一般的な考え方は、データベースエンティティをモデル化する方法でAPIを設計することですか(ミニイベントは、それらが含まれるイベントの主キーを参照し、上記の例ではユーザーの主キーも参照します)、または独立している必要があります

5
tsaebeht

これはユースケースに主観的なものであるため、これについては意見が分かれます。ここで正解はありません。理想的には、ユースケースに最適なAPIを設計します。

  1. event/:event-id/members/members自分に問う質問:「メンバー」リソースは独立していますか?例えば:

    • イベント間でメンバーをフェッチする必要がありますか(たとえば、分析の実行)?私はいつでも/membersを取得し、クエリパラメータとしてevent-idでフィルタリングできます。

    • POST event/:id/membersやGET /members/:idなどのように、よりクリーンな使用法をサポートするために複数のエンドポイントを追加しますか?

  2. あなたが言及した方法(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

4
bholagabbar

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を介して引き続きアクセスできます。

3
Kayaman