rest - REST API 最佳实践
问题描述
我想知道在 REST API 和数据库设计方面这种情况的最佳实践是什么。
场景是我们的书的页面有单词。
my_external_id
Books 有一个我想用来引用它的外部 id(例如)。GET /books/my_external_id/
我想通过页码(1、2、3 等)或外部页面 id(
my_external_page_id
这将是唯一的)来引用页面。我是否需要以某种方式定义我引用哪种类型的页面 id?GET /books/my_external_id/pages/1
PUT /books/my_external_id/pages/1
GET /pages/my_external_page_id
PUT /pages/my_external_page_id
我想根据书的页码获取和添加单词。
GET /books/my_external_id/pages/1/words
PUT /books/my_external_id/pages/1/words
GET /pages/my_external_page_id/words
PUT /pages/my_external_page_id/words
这里有什么完整的解决方案?
解决方案
我是否需要以某种方式定义我引用哪种类型的页面 id?我会说这取决于您要查询的内容
如果您正在GET
阅读一本书,则书籍的页面从 1 开始按顺序编号。
GET /books/my_external_id/pages/1
以上对我来说很有意义,因为您要的是Page
1Book
标识的my_external_id
. 那Page
将Word
与它相关联。因此,您的数据模型由以下对象组成:
Book
有 1 个或更多Page
有 1 个或更多Word
以上可用于为您的书籍、页面和文字世界建模。my_external_id
只是用来进入那个书本世界。即,这是您获得一本书的唯一途径。如果您进入实体图书馆,您需要一张图书馆会员卡才能取出一本书,但您不需要该卡来阅读这本书,因为这本书具有页面和文字等内在属性。因此,一旦您使用my_external_id
(实际上是您的借书证)来获取您的书,您应该能够从那时起使用数据模型:
GET /books/my_external_id/pages/1
GET /books/my_external_id/pages/1/words/
GET /books/my_external_id/pages/1/words/23
您的其他入口点(迷你图书馆卡?)可用于在不同点输入您的数据模型,假设my_external_page_id
并且my_external_word_id
在所有书籍中都是唯一的:
GET /pages/my_external_page_id
GET /words/my_external_word_id
但之后您将处于“数据模型”模式,即获取页面上的第 50 个单词:
GET /pages/my_external_page_id/50
使用50
th 词代替my_external_word_id
,这是一个入口点,而不是数据模型 ( 50
)。
更新工作相同。只需选择要处理的模型对象:
获取一本书的第 10 页:
GET /pages/my_external_page_id
获取该页面的所有单词:
GET /pages/my_external_page_id/words
更新第 10 页的第 20 个字:
PUT /pages/my_external_page_id/words/20
以上使用数据模型方法。my_external_page_id
得到一个Page
which 有Word
实例,你想更新第 20个Word
实例,而不是使用my_external_word_id
which 会返回一个Word
实例。
最终,您的模型可能是:
Book
有id
, title
, author
, isbn
,numberOfPages
和listOfPages
一个Page
实例列表。
Page
有id
, 和一个Word
实例列表。它也可以有number
,但这只与Book
拥有它的人有关。要获得第 10Page
个,Book
您可以通过listOfPages
inBook
或迭代listOfPages
直到找到Page
with number = 10
。
Word 有id
和text
。
除非您想独立于实例访问Page
和实例,否则这应该足够了,但您最终需要在过程中的某个地方,因为这是s 和s 的唯一来源。Word
Book
Book
Page
Word