【问题标题】:Which RESTful route to use when updating an item involves creating and adding a new item to it?更新项目时使用哪个 RESTful 路由涉及创建和添加新项目?
【发布时间】:2020-01-25 15:55:17
【问题描述】:

编码新手,对路线结构而不是实际编码有疑问。我将使用下面的图书馆和图书网络应用示例来澄清我的问题。

我想创建一个新库: POST 库路由。

我想更新库名称: PUT 库/libraryId 路由。

我想创作一本新书。 发布书籍

我想更新书名。 放置书籍/bookId

我正在我的单页应用中查看图书馆中的图书列表。有一个表格可以将新书添加到图书馆。

表单应该走哪条路线符合 RESTful 路由或无关紧要?

  1. 表格帖子到新书路线,然后更新图书馆: POST /books/libraryId

  1. 表单 PUT 到更新库路径并在该路径中创建新书: PUT /library/libraryId/newbookname

编辑:基于以下 cmets 的一些说明.. 所以在我的场景中,用户可以在图书馆之外创建新书,但他们不能分配给图书馆。图书管理员管理图书馆,因此可以创建新书,这些新书会自动添加到他们的图书馆中。

【问题讨论】:

  • 如果您的应用不允许单独添加书籍,并且您只能在图书馆中添加新书籍,那么拥有两个单独的端点 (POST+PUT) 是没有意义的。您可以通过一个 API 调用来做到这一点,我认为该调用将遵循以下顺序:创建一本新书 --> 将其添加到适当的图书馆:如果在将书添加到图书馆时出现问题 --> 新创建的书必须被删除以避免混淆。如果您可以单独添加书籍,然后将它们分配给图书馆,那么您可以按照相同的步骤操作:添加一本书 --> 分配给图书馆
  • 很抱歉在超时之前没有完成我的编辑。所以在我的场景中,用户可以在图书馆之外创建新书,但他们不能分配给图书馆。图书馆员管理图书馆,因此可以创建新书,这些新书会自动添加到他们的图书馆中。这会改变你的看法吗?
  • 这真的取决于你的数据库结构和你的应用程序是如何设计的。您可以按照您所描述的两种方式进行操作。在我看来,您仍然必须创建新书,并且只有当该调用成功时,您才会使用新创建的书 ID 调用更新库根来更新您的库。因此,最终您将拥有两个独立的端点,您将一个接一个地调用它们(POST --> PUT
  • 这很有帮助。非常感谢。

标签: node.js rest post routes put


【解决方案1】:

在我看来,如果书籍与图书馆相关,那么您将有这样的路线来创建书籍:POST /libraries/libraryId/books,并更新书籍:PUT /libraries/libraryId/books/bookId

还要确保遵守这些关于 HTTP 方法的基本规则:https://nordicapis.com/understanding-idempotency-and-safety-in-api-design/

POST 并不总是用于创建,PUT 并不总是用于更新。

【讨论】:

  • 谢谢。在我的情况下,会有用户创建的新书与图书馆无关。图书管理员可以创建自动与其图书馆关联的新书,但也可以取消与该图书馆的链接。
  • 好的,所以可能只有一个 POST /books 并且在正文中有时是一个给定的 libraryId,在更新中你也可以传递一个 libraryId 来更新它
【解决方案2】:

target-uri 的选择主要取决于您希望自动使哪个当前缓存的资源失效。见RFC 7234

例如,考虑这个协议:你GET /libraries/123,并在表示中观察到一本书丢失了。因此,您可以获取将图书添加到图书馆并提交的表单。该提交应该去哪里?

嗯,/libraries/123 的当前缓存表示没有那本书,所以如果我们希望用户能够验证事情发生了变化,那么他们将需要一个新的 /libraries/123 副本来查看在,所以我们应该通过向/libraries/123提交post请求来使当前缓存的副本无效

请注意,这与我们在尝试更新该库名称时使用的 target-uri 相同。这是故意的。

要考虑的一个很好的启发式方法是“您将如何在网络上执行此操作?”。当我们使用 HTML 导航域应用程序协议时,POST 是我们唯一可用的不安全方法。因此,添加新书和更改名称都将是 POST 请求——换句话说,POST 处理程序可能需要查看请求的正文以确定要做什么。

【讨论】:

  • 这真的很有帮助,谢谢。那么您是说使用 PUT /libraries/123 路由并使用带有包含新书标志和数据的正文的表单而不是随后更新图书馆的新书路由更合适吗?
猜你喜欢
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 2020-06-27
相关资源
最近更新 更多