Java RESTful web服务中复合对象的URI

Java RESTful web服务中复合对象的URI,java,spring,rest,jakarta-ee,uri,Java,Spring,Rest,Jakarta Ee,Uri,我已经创建了路径: POST /books/4/chapters 章节实体是书籍组成部分。没有一本书,它就不可能存在于系统中。现在,在通过发布到上面的URI创建了一个章节之后,我是否应该为应答资源创建另一组URI来更新和获取特定章节 GET/books/4/chapters/6或GET/chapters/6 记住,一旦你有了一个级别的主键,你通常不需要包含上面的级别,因为你已经得到了你的特定对象。换句话说,您不需要太多URL比我们上面的/resource/identifier/resourc

我已经创建了路径:

POST /books/4/chapters 
章节
实体是
书籍
组成部分。没有一本书,它就不可能存在于系统中。现在,在通过发布到上面的URI创建了一个章节之后,我是否应该为应答资源创建另一组URI来更新和获取特定章节

GET/books/4/chapters/6
GET/chapters/6

记住,一旦你有了一个级别的主键,你通常不需要包含上面的级别,因为你已经得到了你的特定对象。换句话说,您不需要太多URL比我们上面的/resource/identifier/resource更深的情况

来自apigee Web API设计

这个
GET/chapters/6
将更符合文章所说的内容,但是这也意味着您的对象不再在其父对象的范围内(因为它是类Book的复合对象的一部分)。不过,我觉得这样更好,因为章节也可以是其他对象的组合,这意味着您可以得到长嵌套URI

GET/books/4/chapters/5/paragrahps/5
如果所有内容都应在父级范围内

这样做的首选方式是什么

编辑


经过更多思考后,最好使用URI,如
/books/4/chapters/9
等,因为代码中没有用于检索特定反馈的存储库等,而没有其父级,因为它是一个复合的?

我所做的肯定是您提到的方式。例如:

/books/4/chapters--GET:检索该书的完整章节列表
/books/4/chapters/9--GET:检索第4册的第9章。
重要的关键字是of。这是一本书的一章,如果没有书的话,完全没有关系。仅仅做
/chapters/9
是非常不清楚的。您将其视为一个完整的实体,而它实际上是一本书的子集

使用上面演示的方法,您将拥有非常清晰的URI。您需要检索一个特定的资源(第9章),它是另一个资源的子资源(因此,您必须提到“超级”资源)

我真的建议你看看大卫·祖尔克的作品,他是Symfony团队的一名成员。这是一个关于REST的语言不可知论的演示。更准确地说,它讨论了从16分钟到30分钟的URI,但整个演示非常棒,值得一看


关于apigee演示文稿的说明 我今天看了,虽然我同意他们的观点,但在大多数情况下。我在这里看到一件事。虽然它可能是伟大的,能够检索到一个章节

/chapter/{its id}--GET
问题是,在某些情况下,您需要一本书的第9章,而不一定要检索第238723章(不清楚它是否是第9章)。在这种情况下,通过执行以下操作来检索它更有意义:

/books/4/chapters/9——获取

为什么要否决合法问题?+1因为这是合法问题。=)但你的意思仍然是,当一个章节是一篇作文的一部分时,应该可以像这样通过id检索它,对吗?因为您通常不会为这样的对象创建存储库/dao等,所以它们是本书的一部分,所以它们总是通过本书进行操作?至少对我来说,这是最有意义的。对于最后一种方法,如果你删除了
/books/4/chapters/9--
,总共有20章,会发生什么。每个章节都有自己的持久ID,但假设您在将章节添加到书中时设置的章节顺序是一个临时属性。那么糟糕吗?我的意思是,你将如何实现一个组成部分的章节(或任何其他实体)的漂亮ID?我取决于你如何制作章节的PKEY。他们有自己的身份证吗?他们是否有一个复合键,即图书id和一个id(即章节号)。它们都有一个Id,但它们也有一个唯一的图书Id+订单(这将是我们的9)。我认为所有这些情况都可以使用,只要api的规范中有明确的说明。最重要的是,API的用户(他们在ApieGe视频中提到了这一点)没有歧义,因为毕竟,您想要的是API得到使用。