これは、私がこの場所で持っているのと同じ質問を見つけることができなかった数少ない瞬間の 1 つなので、私の問題を説明しようとしており、アイデアの助けを得たいと思っています!
まあ言ってみれば...
次のようなエンティティ/リソースを持つ可能性のあるドメイン モデル用の RESTful API を設計したいと考えています。
class Product
{
String id;
String name;
Price price;
Set<Tag> tags;
}
class Price
{
String id;
String currency;
float amount;
}
class Tag
{
String id;
String name;
}
API は次のようになります。
GET /products
GET /products/<product-id>
PUT /prices/<price-id>?currency=EUR&amount=12.34
PATCH /products/<product-id>?name=updateOnlyName
参照を更新する場合:
PATCH /products/<product-id>?price=<price-id>
PATCH /products/<product-id>?price=
製品の価格参照を別の既存の価格に設定するか、この参照を削除することができます。
しかし、どうすれば既存のタグの新しい参照を製品に追加できますか?
その参照をリレーショナル データベースに格納したい場合は、その多対多リレーションシップ用のリレーションシップ テーブル「products_tags」が必要でした。これにより、明確な解決策が得られます。
POST /product_tags [product: <product-id>, tag: <tag-id>]
しかし、ドキュメントベースの NoSQL データベース (MongoDB など) は、これを各製品の 1 対多の関係として格納できるため、関係を保存するために作成する必要がある「新しいリソース」をモデル化する必要はありません。
しかし
POST /products/<product-id>/tags/ [name: ...]
creates a new Tag (in a Product),
PUT /products/<product-id>/tags/<tag-id>?name=
creates a new Tag with <tag-id> or replaces an existing
Tag with the same id (in a Product),
PATCH /products/<product-id>?tags=<tag-id>
sets the Tag-list and doesn't add a new Tag, and
PATCH /products/<product-id>/tags/<tag-id>?name=...
sets a certain attribute of a Tag.
だから私はこれにリンクする何かを言いたいかもしれません:
ATTACH /products/<product-id>?tags=<tag-id>
ATTACH /products/<product-id>/tags?tag=<tag-id>
ポイントは次のとおりです。
新しいリソースを作成したくありません。
リソースの属性を設定したくないのですが、
セットである別のリソース属性にリソースを追加したいと考えています。^^
すべてはリソースに関するものなので、次のように言えます。
リソースを別のリソースにアタッチしたい。
私の質問:どの方法が適切で、URL はどのように表示されますか?