【问题标题】:RESTful Soft DeleteRESTful 软删除
【发布时间】:2013-03-28 04:11:29
【问题描述】:

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

先介绍一下背景:

我的 webapp 管理通用实体,这些实体也在另一个系统中管理(而且,它总是创建)。所以在我的 webapp 中,每个实体都将使用唯一的键存储在数据库中。但是我们将通过 URL 访问它们的方式是使用 other 系统的唯一键。

我想一个简单的例子就可以清楚地说明这一点。获取 URL /entity/1。这将显示 ID 为 1 的实体的信息在另一个系统中,而不是我自己的系统。事实上,我系统中的 ID 将完全隐藏。在我自己的系统中,将没有用于访问 ID 为 1 的实体的 URL 方案。

好的,既然我们知道了我的 web 应用程序的结构,让我们回到删除这些实体。

将有一种方法可以“删除”我的系统中的实体,但我在它周围加上了引号,因为它实际上不会从数据库中删除它们。相反,它会使用一个属性来标记它们,当您转到 /entity/1 时,它会阻止它出现。

因此,我觉得我应该使用PUT(这种方式'删除'将是幂等的),因为从数据的角度来看,我只是设置一个属性。

所以,问题是:RESTful 方法是否对数据有保真度(在这种情况下,我很清楚我是 PUTing),或者在应用程序中的数据表示(在这种情况下,我似乎我是DELETEing)?

【问题讨论】:

    标签: rest put


    【解决方案1】:

    你应该使用DELETE

    您打算对数据执行的操作称为“软删除”:您设置了一个标志并避免出现已标记的项目。这是您的 webapp 内部的,用户不必知道您正在软删除而不是删除或您想做的任何事情。这就是为什么你应该使用DELETE 动词。

    【讨论】:

    • 是的 - 您应该使用描述您想要发生的事情的动词/方法。删除是更好的选择
    • 我也同意alestanis。
    • 感谢您的回复,alestanis!我已经同意你的推理了;在我接受之前,我只是在等待几天,看看是否出现了任何其他令人信服的回应。
    • 我要补充一点,如果您希望 API 用户能够隐藏资源,它类似于删除,但是您向他们公开该功能意味着您最好使用 PUT带有活动/禁用/等字段。我现在正在实现这个,现在我已经转移到将软删除传播到所有关系的问题上。
    • 但是如果你同时支持软删除和硬删除怎么办?
    【解决方案2】:

    我认为没有明确的答案。我会依赖 1. 软删除、恢复和销毁操作是否是您的 api 的实际功能或 2. 软删除只是一种“偏执”的数据库工程模式。

    1. “软”删除对 api 客户端是透明的,在这种情况下使用 DELETE 动词似乎是可行的方法

      一切都好像要一劳永逸地删除该项目,但工程师希望将其保留在数据库中的某个位置

    2. Api 客户端有能力恢复或销毁软删除的资源,在这种情况下,软删除和恢复可以使用 PUTPATCH(或 POST 在不同的操作 url 上,如 /resource/:id/softdelete)和销毁操作应该是使用DELETE 的操作。

    【讨论】:

      【解决方案3】:

      DELETE方法在HTTP中有非常具体的语义,千万不能重载 或被 REST API 的设计拉伸。具体来说,API 不应扭曲预期的 DELETE 的含义是通过将其映射到离开资源的较小操作及其 URI, 可供客户使用。例如,如果 API 希望提供“软”删除或某些 其他状态改变的交互,它应该使用一个特殊的控制器资源和 指示其客户端使用 POST 而不是 DELETE 进行交互。

      来源:Mark Massé 撰写的 Rest-API 设计规则书

      建议

      POST: /entity/1/your-soft-delete-controller-name
      

      【讨论】:

        猜你喜欢
        • 2012-09-04
        • 2011-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多