2013-04-20 111 views
3

我已经创建了以下实体Book,ChapterFeedbackBook有许多Chapter实体,它也有许多Feedback实体。由于没有Chapter实体可以靠自己生活,所以它们是Book构图的一部分。这同样适用于Feedback实体。如何处理RESTful Web服务中的聚合和组合

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

/books/1/chapters (With POST, DELETE, PUT operations) 
/books/1/feedback (With POST, DELETE, PUT operations) 

还是应threated这样的:

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

最后一个URI意味着API的用户将不得不反馈添加到本书的数组,然后更新整个图书实体。

因为章节不属于任何其他对象,并且它们的生命周期取决于书本,所以称作书籍和章节“组合+聚合”之间的关系是否合理?

+1

明确地去找第一个选项。否则,如果你正在做本书的REST,那么你需要将整本书放入其中以添加其他反馈。这是要传输的数据量很大;并且它还具有更多的并发更新隐含的含义。 – skirsch 2013-04-20 10:44:31

回答

8

我的问题是,是一个组成部分对象是否应该有自己的URI在RESTful系统

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

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

而且它是有意义的调用之间的书籍和章节“组成+聚合”,因为章不属于任何其他对象,其生命周期的关系取决于书

这使得意思是指组成的关系。汇总将意味着子资源(章节)可能存在于其父项范围之外(本书),在这种情况下它不能。聚合的例子可以是地址,其可以与组织相关联。

+0

太棒了,谢谢:) – LuckyLuke 2013-04-20 13:50:40

+0

Up voteed。我的官方项目也面临类似的情况,我试图说服人们遵循这种方法来管理实体的特定部分,而不是处理。这有助于在提供细粒度控制的同时保持较低的网络流量。 – 2015-06-03 09:06:07