【发布时间】:2017-07-19 08:33:35
【问题描述】:
我想知道当您拥有包含子资源列表的资源时,最佳做法是什么。例如,您有资源作者,其中包含姓名、身份证、生日和书籍列表等信息。此书单仅与作者有关。所以,你有以下场景:
- 您想将一本新书添加到图书列表中
- 您想更新列表中的一本书的名称
- 您想从列表中删除一本书
解决方案 1
我搜索了正确的设计,并找到了多种方法。我想知道是否有一种标准的设计方法。我认为书上的设计说有以下方法:
- 添加:
POST /authors/{authorId}/book/ - 更新:
PUT /authors/{authorId}/book/{bookId} - 删除:
DELETE /authors/{authorId}/book/{bookId}
解决方案 2
我的解决方案是只使用一个 PUT 方法来完成所有这 3 件事,因为书籍列表仅存在于对象作者内部,而您实际上是在更新作者。比如:
PUT /authors/{authorId}/updateBookList(并在作者对象中发送整个更新的书单)
我在我的场景中发现了多个错误。例如,从客户端发送更多数据,在客户端有一些逻辑,在 API 上进行更多验证,并且还依赖于客户端拥有最新版本的 Book List。
我的问题是:这样做是反模式吗?
情况 1. 在我的情况下,我的 API 正在使用另一个 API,而不是数据库。使用的 API 只有一种“updateBookList”方法,所以我猜想在我的 API 中复制这种行为也更容易。也对吗?
情况 2。但是,假设我的 API 将使用数据库,是否更适合使用解决方案 1?
另外,如果您能提供一些文章、书籍,您可以在其中找到类似的信息。我知道这种设计不是一成不变的,但一些指导方针会有所帮助。 (示例:来自 Book REST API Design Rulebook - Masse - O'Reilly)
【问题讨论】:
-
如果这是一个真正的问题而不是家庭作业,请记住书籍可以有多个作者。一本书应该是真正的顶级资源。
-
这是一个真正的问题,但在我的情况下,书籍列表只属于一位作者。例如,如果您删除某个作者,这些书籍将不再存在。
-
现在。如果业务需求发生变化,您将面临 API 更改中断的风险。当然,只有您知道这种可能性有多大。
标签: rest api-design restful-url httpverbs