Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RESTful软删除_Rest_Put - Fatal编程技术网

RESTful软删除

RESTful软删除,rest,put,Rest,Put,我正在尝试构建一个RESTful Web应用程序,其中我使用GET、POST、PUT和DELETE。但是我有一个关于在这个特定应用中使用DELETE的问题 首先介绍一下背景知识: 我的webapp管理的通用实体也在另一个系统中进行管理(有时,总是创建的)。因此,在我的webapp中,每个实体都将使用唯一的密钥存储在数据库中。但我们通过URL访问它们的方式是使用另一个系统的唯一密钥 我认为,一个简单的例子可以说明这一点。以URL/entity/1为例。这将显示其他系统中ID为1的实体的信息,而不是

我正在尝试构建一个RESTful Web应用程序,其中我使用GET、POST、PUT和DELETE。但是我有一个关于在这个特定应用中使用DELETE的问题

首先介绍一下背景知识:

我的webapp管理的通用实体也在另一个系统中进行管理(有时,总是创建的)。因此,在我的webapp中,每个实体都将使用唯一的密钥存储在数据库中。但我们通过URL访问它们的方式是使用另一个系统的唯一密钥

我认为,一个简单的例子可以说明这一点。以URL
/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。我现在正在实现这一点,现在我开始讨论将软删除传播到所有关系的问题。但是,如果您同时支持软删除和硬删除,应该如何区分它们呢?