如何在RESTful Web服务中处理聚合和组合

3
我已经创建了以下实体:BookChapterFeedbackBook有许多Chapter实体,还有许多Feedback实体。由于没有Chapter实体可以独立存在,它们是Book组成的一部分。对Feedback实体也是同样如此。
我的问题是,在RESTful系统中,作为组成部分的对象是否应该有自己的URI?例如:
/books/1/chapters (With POST, DELETE, PUT operations) 
/books/1/feedback (With POST, DELETE, PUT operations)

还是应该像这样处理:

/books/1 (With POST, DELETE, PUT operations only on the book)

最后一个URI的意思是API的用户需要将反馈添加到书籍的数组中,然后更新整个书籍实体。

既然章节不属于任何其他对象,并且它们的生命周期取决于书籍,那么将书籍和章节之间的关系称为“组合+聚合”是否有意义呢?


1
毫无疑问,应该选择第一种选项。否则,如果你按照规范进行REST,你需要PUT整本书才能添加另一个反馈。这将传输大量数据,并且还会涉及到并发更新的更大影响。 - skirsch
1个回答

8
我的问题是,在RESTful系统中,组合的一部分是否应该有自己的URI?
是的,绝对应该有。当这些部分可以独立寻址时,访问和管理实体表示中的特定部分会变得“显着”更容易。 客户端不必每次检索整个表示形式才能更新其中的小部分,它们可以专注于只需要修改的那一部分。 它也极大地简化了访问控制,在某些终端点可能仅对特定的调用方可用,而不对其他终端点可用。
在定义子资源URI时需要保持的一个限制是,它们始终在其父资源的范围内定义(正如您已经在示例中显示的那样)。
关于书籍和章节之间的关系,“组合+聚合”是否有意义? 因为章节不属于任何其他对象,其生命周期取决于书籍。
将这种关系称为“组合”是有意义的。聚合意味着子资源(章节)可以存在于其父级(书籍)之外的范围之内,在这种情况下是不可能的。聚合的一个例子是地址,它可以与“人”或“组织”相关联。

已点赞。我们的官方项目也面临类似的情况,我正在努力说服人们采用管理实体特定部分的方法,而不是处理整个实体。这有助于保持网络流量低,同时提供细粒度控制。 - Manchanda. P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接