如何使用 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 从子集中删除项目的主要内容,如果未能解决你的问题,请参考以下文章
如何在 django rest 框架中对项目的删除 url 进行 url-reverse