【问题标题】:RESTful delete strategyRESTful 删除策略
【发布时间】:2009-02-04 17:04:21
【问题描述】:

假设我有一个资源,在调用 delete 时可以有两种不同的行为

  1. 资源被删除。
  2. 资源已移至回收站。

如何以符合 REST 的方式对其进行建模?

我想到了以下解决方案:

DELETE /myresource     

将资源移动到回收站(默认行为)

DELETE /myresource?force-delete=true  

强制删除资源。

这符合 REST 吗?我在调用DELETE的时候从来没有在URL中看到查询参数,可以吗?

【问题讨论】:

    标签: rest


    【解决方案1】:

    您的想法很好,但我认为自定义请求标头会更合适一些。查询参数更适合参数。

    自定义请求标头如下所示:

    DELETE /myresource
    X-Really-Delete: Yup
    

    【讨论】:

      【解决方案2】:

      纯 REST 策略应该更喜欢不变的资源。在我看来,您并没有通过附加参数来更改资源,所以对我来说这听起来是个好策略。

      如果你要像这样执行相同的操作:

      DELETE /myresource.force
      

      这就像另一种资源,不是最佳的。

      【讨论】:

      • 这打破了 REST 的“规则”,因为您正在处理不同的资源。同时,/myresource.json 和 /myresource.xml 也提供相同数据的不同格式(使用您的接受标头,人们!)但这不会很快消失。
      • 这不是“REST”,您正在以 RPC 方式执行操作。
      【解决方案3】:

      为什么不呢?您已经传递了一个参数来识别哪个资源,因此发送另一个参数来建立不同的操作过程。 IMO,它完全是 RESTful。

      【讨论】:

        【解决方案4】:

        您也可以将 2. 实现为 POST 请求而不是 DELETE。

        POST /myresource
        
        recycle-bin=true...
        

        正如你所做的就是更新资源以表明它在回收站中。

        编辑:将方法从 PUT 更改为 POST 给定 PUT 必须包含资源的完整替换(或添加),而显然这里我们只是更新了一部分资源。

        【讨论】:

        • 我反对您从 PUT 更改为 POST。 POST 用于创建内容,PUT 用于修改; OP 真正做的就是用特定值标记资源,即更新它。
        • @thecoshman PUT 是创建或替换,这需要将整个实体包含在请求中。可以通过 PATCH 方法进行修改,但支持有限。
        • 呃……有点。 PUT 可用于创建内容,POST 也可以。不同之处在于您在特定的 URI 上创建 PUT,而 POST 您要求服务器计算出将其存储为的 URI。 PUT 也可以用来完成一个资源的替换。你说得对,真正的 PATCH 是进行这样的小更新的正确方法。在没有适当支持的情况下,“适当”的解决方案是获取完整资源,对其进行更新,然后将完整的更新资源放回服务器上,使用相同的 URI。
        【解决方案5】:

        DELETE 应该删除项目,不问任何问题。

        遗憾的是,HTTP 中没有“MOVE”请求。 POST 通常用于创建内容,PUT 是更多的修改。

        因此,我建议您使用某种形式的元数据或沿 { "recycle":"true" } 行的 json 字符串执行类似 PUT /myresource 的操作,以表明您想要“回收”它。

        【讨论】:

          猜你喜欢
          • 2011-05-26
          • 1970-01-01
          • 2018-01-24
          • 1970-01-01
          • 2013-09-06
          • 2019-10-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多