RESTful软删除
我正在尝试构建一个RESTful Web应用程序,其中我使用GET、POST、PUT和DELETE。但是我有一个关于在这个特定应用中使用DELETE的问题 首先介绍一下背景知识: 我的webapp管理的通用实体也在另一个系统中进行管理(有时,总是创建的)。因此,在我的webapp中,每个实体都将使用唯一的密钥存储在数据库中。但我们通过URL访问它们的方式是使用另一个系统的唯一密钥 我认为,一个简单的例子可以说明这一点。以URLRESTful软删除,rest,put,Rest,Put,我正在尝试构建一个RESTful Web应用程序,其中我使用GET、POST、PUT和DELETE。但是我有一个关于在这个特定应用中使用DELETE的问题 首先介绍一下背景知识: 我的webapp管理的通用实体也在另一个系统中进行管理(有时,总是创建的)。因此,在我的webapp中,每个实体都将使用唯一的密钥存储在数据库中。但我们通过URL访问它们的方式是使用另一个系统的唯一密钥 我认为,一个简单的例子可以说明这一点。以URL/entity/1为例。这将显示其他系统中ID为1的实体的信息,而不是
/entity/1
为例。这将显示其他系统中ID为1的实体的信息,而不是我自己的系统。事实上,我的系统中的ID将被完全隐藏。在我自己的系统中,将不会有用于访问ID为1
的实体的URL方案
好了,现在我们知道了我的webapp是如何构造的,让我们回到删除这些实体上来
有一种方法可以在我的系统中“删除”实体,但我在它周围加了引号,因为它实际上不会从数据库中删除它们。相反,它将使用一个属性来标记它们,以防止在您转到/entity/1
时出现该属性
因此,我觉得我应该使用PUT
(“deleting”以这种方式将是幂等的),因为从数据的角度来看,我只是简单地设置了一个属性
因此,问题是:RESTful方法是否对数据有保真度(在这种情况下,很明显我是
PUT
ing),还是对应用程序中的数据表示有保真度(在这种情况下,我似乎是DELETE
ing)?您应该使用DELETE
您打算对数据执行的操作称为“软删除”:您设置了一个标志并避免出现标记的项目。这是你的webapp内部的,用户不必知道你在软删除,而不是删除或任何你想做的事情。这就是为什么你应该使用
删除动词。我认为没有明确的答案。我将依靠1。软删除、恢复和销毁操作是api或2的实际功能。软删除只是一种“偏执”的数据库工程模式
“软”删除对于api客户机来说是透明的,在这种情况下,使用DELETE
动词似乎是一种方法
一切都像是要一劳永逸地删除该项,但工程师希望将其保留在数据库中的某个位置
Api客户端能够恢复或销毁软删除的资源,在这种情况下,软删除和恢复可以使用PUT
或PATCH
(或POST
在不同的操作url上,如/resource/:id/softdelete
),销毁操作应该是使用DELETE
的操作
是-你应该使用动词/方法来描述你想要发生的事情。删除是更好的选择我也同意alestanis。谢谢你的回复,alestanis!我同意你的推理;在我接受之前,我只是等了几天,看看是否有任何其他令人信服的响应出现。我想补充一点,如果你想让API用户能够隐藏资源,这类似于删除,但事实上你向他们公开了该功能,这意味着你最好使用带有活动/禁用/etc字段的PUT。我现在正在实现这一点,现在我开始讨论将软删除传播到所有关系的问题。但是,如果您同时支持软删除和硬删除,应该如何区分它们呢?