我在工作中遇到了一个问题,我找不到有关在 RESTful Web 服务中针对主键是其他资源 ID 组合的资源执行 CRUD 操作的常用标准或实践的信息。我们正在使用 MVC WebApi 创建控制器。例如,我们有三个表:
Product
: PK=产品编号Part
: PK=PartIdProductPartAssoc
: PK=(ProductId, PartId)
一个产品可以有很多部分,一个部分可以是很多产品的组成部分。关联表还包含与关联本身相关的附加信息,而不是需要可编辑的。
我们有ProductsController
和PartsController
类使用定义为的路由模板处理通常的 GET/PUT/POST/DELETE 操作:{controller}/{id}/{action}
这样以下 IRI 可以工作:
- GET,POST
/api/Products
- 返回所有产品,创建一个新产品 - GET,PUT,DELETE
/api/Products/1
- 检索/更新/删除产品 1 - GET,POST
/api/Parts
- 返回所有部分,创建一个新部分 - GET,PUT,DELETE
/api/Parts/2
- 检索/更新/删除第 2 部分 - GET
/api/Products/1/Parts
- 获取产品 1 的所有部件 - GET
/api/Parts/2/Products
- 获取第 2 部分是组件的所有产品
我遇到的问题是如何为 ProductPartAssoc 资源定义路由模板。获取关联数据的路由模板和 IRI 应该是什么样的?遵守惯例,我希望是这样的:
- GET,POST
/api/ProductPartAssoc
- 返回所有关联,创建关联 - GET,PUT,DELETE
/api/ProductPartAssoc/[1,2]
- 检索/更新/删除产品 1 和第 2 部分之间的关联
我的同事发现这在美学上令人不快,并且似乎认为完全没有ProductPartAssocController
课程会更好,而是ProductsController
向管理关联数据添加额外的方法:
- GET,PUT,DELETE
/api/Products/1/Parts/2
- 获取产品 1 和第 2 部分之间关联的数据,而不是作为第 1 部分的成员的第 2 部分的数据,这通常是基于其他示例(例如/Book/5/Chapter/3
我在其他地方看到的)的情况。 - POST 这里不知道他们期望 IRI 是什么样子。不幸的是,他们是决策者。
归根结底,我想我正在寻找的不是验证,就是我可以指出并说“看,这就是其他人所做的”的方向。
处理由复合键标识的资源的典型做法是什么?