如何处理RESTful Web服务中的聚合和组合
我创建了以下实体, Book
, Chapter
和Feedback
。 Book
有很多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时要保留的一个约束是它们始终在其父资源的范围内定义(正如您在示例中已经显示的那样)。
因为章节不属于任何其他对象而且它们的生命周期依赖于书籍,所以将书籍和章节之间的关系称为“构图+聚合”是否有意义
将关系称为组合是有意义的。 聚合意味着子资源( 章节 )可能存在于其父( 书 )的范围之外,在这种情况下它不能。 聚合的一个例子是地址,它可以与一个人或一个组织相关联。