我创建了路径:
POST /books/4/chapters
Chapter
实体是Book
组合的一部分。没有书就不能存在于系统中。现在在通过发布到上面的URI创建章节之后,我应该为答案资源创建另一组URI来更新和获取特定章节吗?
GET /books/4/chapters/6
或GET /chapters/6
?
请记住,一旦拥有一个级别的主键,通常不需要包含上述级别,因为您已经拥有了特定的对象。换句话说,您不应该需要太多的情况,其中URL比我们上面的资源/资源/标识符/资源更深。
来自apigee Web API Design
这个GET /chapters/6
对于文章所说的更为真实,但这也意味着你的对象不再在其父级的范围内(因为它是类Book的复合对象的一部分)。但是我觉得这更好,因为章节可能是其他对象的组合,这意味着你得到长嵌套的URI
GET /books/4/chapters/5/paragrahps/5
如果一切都在父母的范围内。
这样做的首选方法是什么
修改
在进一步思考之后,最好使用像/books/4/chapters/9
等URI这样的优点,因为在代码中没有存储库等来检索没有父项的特定反馈,因为它是复合的?
答案 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,但整个演示很棒,值得一看。
我今天看过它,虽然我同意它们,但在大多数情况下。我在这里看到一件事。虽然能够通过
检索章节可能会很棒/chapter/{its id} -- GET
问题在于,在某些情况下,您需要图书的 第9 章,而不一定要检索章 238723 (目前还不清楚它是第9章)。在这种情况下,通过执行以下操作来检索它更有意义:
/books/4/chapters/9 -- GET