问题描述
我想知道以一种宁静的方式从子集中删除项目的最佳方法是什么。我有用户和系列,每个用户都有自己的系列列表(观看、完成等)。例如,如果我们想从用户那里获取一个列表,我们可以使用: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 是正确的。
为了选择从子集中删除对象/项目的其余操作,这种差异是否重要?
解决方法
你会如何在网络上做到这一点?
您可以点击一个带有输入控件的表单链接。如果您想一次删除一个系列,您可能有一个下拉菜单,或者如果您想支持批量删除,则可能有很多复选框。用户提供输入,点击提交按钮,浏览器将创建一个 application/x-www-form-urlencoded 文档并将其发送到服务器。
会使用什么方法?通常是 POST,因为我们打算对服务器上的某些资源进行编辑。
我们要编辑什么资源?好吧,简而言之,它可以是任何东西——服务器会将这些信息包含在表单元数据中,这样客户端就可以按照指示去做。
那么服务器应该告诉它在哪里提交表单?同样,它可以在任何地方……但是一个有用的方法是考虑客户端缓存中的哪些资源正在更新。因为如果我们向该资源发送请求,我们就会“免费”获得智能cache invalidation。
因此在网络上,我们希望看到:
POST /users/:id_user/series
它必须是POST吗?在 HTML 网络上,也许是这样,因为网络无处不在的客户端是浏览器,而不是编辑器。
但是一个完全有效的替代方法是编辑 /users/:id_user/series 的本地副本,然后将新版本 (PUT) 的完整副本或描述编辑内容的补丁文档发送回服务器(修补)。请注意,对于这两种选择,目标 uri 仍然是 /user/:id_user/series
,因此我们仍然获得缓存失效魔法。
在模型中创建新资源只是为了删除某些内容可能是错误的想法。
在某些情况下,编辑或删除必然会影响多个资源。
在某些特定情况下,您可以使用两种资源获得正确的魔法缓存失效(例如,删除一个文档,然后发回另一个文档的更新副本)。
但我们今天没有通用的缓存失效机制。 (我能找到的最接近的东西是 this,它似乎在 2012 年停滞不前。