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

我创建了以下实体, 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的用户必须将反馈添加到书籍的数组,然后更新整个书籍实体。

将章节和章节之间的关系称为“构图+聚合”是否有意义,因为章节不属于任何其他对象,并且它们的生命周期依赖于书籍?

我的问题是作为组合的一部分的对象是否应该在RESTful系统中拥有自己的URI

是的,绝对是。 当这些部分可独立寻址时,它使访问和管理实体表示的特定部分变得更加容易。 而不是要求客户端每次只更新它的一小部分来检索整个表示,而是只关注需要修改的一个部分。 它还极大地简化了访问控制,其中某些端点可能对特定呼叫者可用,但对其他呼叫者不可用。

定义子资源URI时要保留的一个约束是它们始终在其父资源的范围内定义(正如您在示例中已经显示的那样)。

因为章节不属于任何其他对象而且它们的生命周期依赖于书籍,所以将书籍和章节之间的关系称为“构图+聚合”是否有意义

将关系称为组合是有意义的。 聚合意味着子资源( 章节 )可能存在于其父( )的范围之外,在这种情况下它不能。 聚合的一个例子是地址,它可以与一个或一个组织相关联。