私は、リソースがかなり相互に関連しているRESTフルAPIを使用しています。リソースは相互に参照し、これらの参照は作成または削除される場合があります。リソースがハイパーリンクを使用して相互に参照するときに、リソースの関連付けをサポートする方法が少しわかりません。
簡単な例は、AとBの2つのリソースで続きます。
Resource A: name: integer list_b: [list of resource B] Resource B: id: integer description: String
現在、AはドキュメントにBを含めていませんが、Bをリンクしています。ハイパーメディアを使用すると、次のようになります。
Resource A: { id: 1, list_b: [ { id: 1, href: "https://server/api/b/1" }, { id: 2, href: "https://server/api/b/2" } ] }
ユーザーがAのリストにあるB参照の1つを追加または削除したい場合、ハイパーリンクの存在を考慮して、どのように行うのですか?ユーザーが1回のPUT操作でAリソース全体を更新できるようにしたいのですが、出力にはBのどの値が必要かを示すものはありません。ユーザーが次のようなコンテンツでPUTを実行することは私には理にかなっています。
Resource A: { id: 1, list_b: [ { id: 1, href: "https://server/api/b/1" }, { id: 2, href: "https://server/api/b/2" }, { id: 3 }, ] }
次のように(応答で)更新されたリソースを受け取ります。
Resource A: { id: 1, list_b: [ { id: 1, href: "https://server/api/b/1" }, { id: 2, href: "https://server/api/b/2" }, { id: 3, href: "https://server/api/b/3" } ] }
私の懸念は、ユーザーがリソースAを更新するときにリソースに何を含めるかを必ずしも知っているとは限らないことlist_b
です。
あるリソースから別のリソースへのハイパーリンクを処理する場合、作成と更新はどのように機能する必要がありますか?クライアントはリンクの一部(id
)を更新することを許可する必要がありますか、それともリンクの両方の部分を更新する必要がありますか?
注:別のアプローチがリソースAのサブURLを公開する可能性があることを知っています。これはlist_b
、HTTP経由で操作可能なリソースとして公開できます(クライアントがリストリソース自体でPOST、PUT、およびDELETEを使用できるようにします)。ただし、Aに他のリソースタイプへの複数の参照が含まれている場合、これはあまり合理的ではないようです。別のフィールドを参照する各フィールドには、サブURLが必要になる可能性があります。これは、10以上のフィールドがある場合、扱いにくく、リソースを更新するために複数のHTTPリクエストを必要とします。