这是我在这个地方找不到相同问题的少数时刻之一,所以我试图描述我的问题并希望得到一些帮助和想法!
比方说...
我想为域模型设计一个 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)可以将其存储为每个产品的一对多关系,因此我不需要为必须创建以保存关系的“新资源”建模。
但
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 应该是什么样子?