RESTful Web服务中复合对象的URI

时间:2013-04-21 14:28:23

标签: java spring rest java-ee uri

我创建了路径:

POST /books/4/chapters 

Chapter实体是Book组合的一部分。没有书就不能存在于系统中。现在在通过发布到上面的URI创建章节之后,我应该为答案资源创建另一组URI来更新和获取特定章节吗?

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

  

请记住,一旦拥有一个级别的主键,通常不需要包含上述级别,因为您已经拥有了特定的对象。换句话说,您不应该需要太多的情况,其中URL比我们上面的资源/资源/标识符/资源更深。

来自apigee Web API Design

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

GET /books/4/chapters/5/paragrahps/5如果一切都在父母的范围内。

这样做的首选方法是什么

修改

在进一步思考之后,最好使用像/books/4/chapters/9等URI这样的优点,因为在代码中没有存储库等来检索没有父项的特定反馈,因为它是复合的?

1 个答案:

答案 0 :(得分:3)

我会做的绝对是你提到的方式。例如:

/books/4/chapters -- GET : Retrieve full list of chapters of the book
/books/4/chapters/9 -- GET : Retrieve the 9th chapter of book 4. 

重要的关键字是的。这是一本书的一章,如果没有它的书就完全无关紧要。只是做/chapters/9非常不清楚。您将其视为一个完整的实体,而它确实是一本书的一个子集。

使用您所示的方式将有非常清晰的URI。你检索一个特定的资源(第9章),这是另一个的子资源(因此,你必须提到“超级”资源)。

我真的建议你看一下Symfony团队成员DavidZülke的 this great presentation 。这是一个关于REST的语言无关的演示文稿。更确切地说,它讨论了从16分钟到30分钟的URI,但整个演示很棒,值得一看。


关于 apigee 演示文稿

的说明

我今天看过它,虽然我同意它们,但在大多数情况下。我在这里看到一件事。虽然能够通过

检索章节可能会很棒
/chapter/{its id} -- GET

问题在于,在某些情况下,您需要图书的 第9 ,而不一定要检索 238723 (目前还不清楚它是第9章)。在这种情况下,通过执行以下操作来检索它更有意义:

/books/4/chapters/9 -- GET