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

时间:2013-04-20 10:09:02

标签: java spring rest java-ee spring-mvc

我创建了以下实体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 个答案:

答案 0 :(得分:8)

  

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

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

定义子资源URI时要保留的一个约束是它们总是在父资源的范围内定义(正如您在示例中所示)。

  

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

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