如何使用 REST API 从子集中删除项目

Posted

技术标签:

【中文标题】如何使用 REST API 从子集中删除项目【英文标题】:How to delete items from a subset with REST API 【发布时间】:2021-07-18 13:37:13 【问题描述】:

我想知道以宁静的方式从子集中删除项目的最佳方法是什么。我有用户和系列,每个用户都有自己的系列列表(观看、完成等)。例如,如果我们想从用户那里得到一个列表,我们可以这样做:GET /users/:id_user/series

如果我们想从该用户的列表中删除一个系列(但我们不想删除系列本身),应该怎么做?

我考虑过使用 DELETE /users/:id_user/series/:id_serie 的可能性,但我不确定这是否适合这种情况(也许是 PATCH?)。

我收到了另一个案例,我们收到了系列和评论。我们可以获得这样的评论:GET /series/:serie_id/reviews。在另一种情况下,我们不想在从系列的用户列表中删除时删除系列本身,但在这种情况下,我们想删除评论,因为它的存在取决于系列。所以我想在这种情况下 DELETE /series/:serie_id/reviews/:review_id 是正确的。

为了选择其余操作从子集中删除对象/项目,这种差异是否重要?

【问题讨论】:

【参考方案1】:

你会如何在网络上做到这一点?

您可以通过一个链接访问带有输入控件的表单。如果你想一次删除一个系列,你可能会有一个下拉菜单,如果你想支持批量删除,你可能会有很多复选框。用户提供输入,点击提交按钮,浏览器将创建一个 application/x-www-form-urlencoded 文档并将其发送到服务器。

将使用什么方法?通常是 POST,因为我们打算对服务器上的某些资源进行编辑。

我们要编辑什么资源?好吧,实际上,它可以是任何东西——服务器会将该信息包含在表单元数据中,这样客户端就可以按照它的指示去做。

那么服务器应该在哪里告诉它提交表单呢?同样,它可以在任何地方...但是有用的方法是考虑客户端缓存中的哪些资源正在被更新。因为如果我们向该资源发送请求,我们会“免费”获得智能 cache invalidation。

所以在网络上,我们希望看到:

POST /users/:id_user/series

必须是 POST 吗?在 html 网络上,也许是这样,因为无处不在的网络客户端是浏览器,而不是编辑器。

It is okay to use POST.

但一个完全有效的替代方法是编辑 /users/:id_user/series 的本地副本,然后将新版本 (PUT) 的完整副本或描述编辑的补丁文档发送回服务器(修补)。请注意,通过这两种选择,目标 uri 仍然是 /user/:id_user/series,所以我们仍然会获得缓存失效魔法。


在模型中创建新资源只是为了删除某些内容可能是错误的想法。


在某些情况下,编辑或删除必然会影响多个资源。

在某些特定情况下,您可以使用两种资源获得正确的魔法缓存失效(例如,删除一个文档,然后发回另一个文档的更新副本)。

但是,我们今天还没有通用的缓存失效机制。 (我能找到的最接近的东西是this,它似乎在 2012 年停滞不前。

【讨论】:

以上是关于如何使用 REST API 从子集中删除项目的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 REST 从子文档数组中发布、修补和删除项目

用于从子资源列表中更新/添加/删除项目的 REST 设计

python,lxml以及如何从子集中获取html代码

如何在 django rest 框架中对项目的删除 url 进行 url-reverse

如何使用 React 从 DB 中删除数据,并点击我使用 php 和 mysql 创建的 rest API?

如何使用 HttpClient 将带有 JSON 的 DELETE 发送到 REST API