删除一堆项目的宁静方式

时间:2010-03-10 23:55:47

标签: rest

wiki article for REST 表示如果您使用http://example.com/resources DELETE,则表示您正在删除整个集合。

如果使用http://example.com/resources/7HOU57Y DELETE,则表示您正在删除该元素。

我正在做一个网站,请注意NOT WEB SERVICE。

我有一个列表,列表中的每个项目都有1个复选框。一旦我选择了多个要删除的项目,我将允许用户按下名为DELETE SELECTION的按钮。如果用户按下按钮,将弹出一个js对话框,要求用户确认删除。如果用户确认,则删除所有项目。

那么我应该如何以RESTFUL方式删除多个项目呢?

注意,目前对于网页中的DELETE,我所做的是使用带有POST作为操作的FORM标记,但是包含一个自this is what was indicated by others in SO on how to do RESTful delete for webpage以来值为DELETE的_method。

8 个答案:

答案 0 :(得分:49)

一种选择是创建删除“交易”。因此,POST类似于http://example.com/resources/deletes这样的新资源,其中包含要删除的资源列表。然后在您的应用程序中,您只需删除。当您发布帖子时,您应该返回所创建交易的位置,例如http://example.com/resources/deletes/DF4XY7。对此GET可以返回事务的状态(完成或正在进行)和/或要删除的资源列表。

答案 1 :(得分:45)

我认为rojoca's answer是目前为止最好的。稍微变化可能是,在同一页面上取消javascript确认,而是创建选择并重定向到它,在该页面上显示确认消息。换句话说:

自:
http://example.com/resources/

做一个

通过选择ID来进行POST:
http://example.com/resources/selections

如果成功,应该回复:

创建HTTP / 1.1 201,并将Location头标记为:
http://example.com/resources/selections/DF4XY7

在此页面上,您将看到一个(javascript)确认框,如果您确认将执行以下请求:

删除http://example.com/resources/selections/DF4XY7

如果成功,应该回复: HTTP / 1.1 200好(或适用于成功删除的任何内容)

答案 2 :(得分:26)

以下是亚马逊使用他们的S3 REST API所做的事情。

个人删除请求:

DELETE /ObjectName HTTP/1.1
Host: BucketName.s3.amazonaws.com
Date: date
Content-Length: length
Authorization: authorization string (see Authenticating Requests (AWS Signature Version 4))

Multi-Object Delete请求:

POST /?delete HTTP/1.1
Host: bucketname.s3.amazonaws.com
Authorization: authorization string
Content-Length: Size
Content-MD5: MD5

<?xml version="1.0" encoding="UTF-8"?>
<Delete>
    <Quiet>true</Quiet>
    <Object>
         <Key>Key</Key>
         <VersionId>VersionId</VersionId>
    </Object>
    <Object>
         <Key>Key</Key>
    </Object>
    ...
</Delete>           

Facebook Graph APIParse Server REST APIGoogle Drive REST API可以让您在一个请求中“批量”执行单个操作。

这是Parse Server的一个例子。

个人删除请求:

curl -X DELETE \
  -H "X-Parse-Application-Id: ${APPLICATION_ID}" \
  -H "X-Parse-REST-API-Key: ${REST_API_KEY}" \
  https://api.parse.com/1/classes/GameScore/Ed1nuqPvcm

批量请求:

curl -X POST \
  -H "X-Parse-Application-Id: ${APPLICATION_ID}" \
  -H "X-Parse-REST-API-Key: ${REST_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
        "requests": [
          {
            "method": "POST",
            "path": "/1/classes/GameScore",
            "body": {
              "score": 1337,
              "playerName": "Sean Plott"
            }
          },
          {
            "method": "POST",
            "path": "/1/classes/GameScore",
            "body": {
              "score": 1338,
              "playerName": "ZeroCool"
            }
          }
        ]
      }' \
  https://api.parse.com/1/batch

答案 3 :(得分:13)

我会说删除http://example.com/resources/id1,id2,id3,id4或删除http://example.com/resources/id1+id2+id3+id4。正如“REST是一种架构(...)[非]协议”引用这篇维基百科文章,我相信,没有一种方法可以做到这一点。

我知道如果没有带HTML的JS,上面是不可能的,但我觉得REST是:

  • 在不考虑交易等细节的情况下创建。谁需要操作更多单品?这在HTTP协议中是合理的,因为除了静态网页之外,它并不打算通过它提供任何其他服务。
  • 没有必要很好地适应当前的模型 - 即使是纯HTML。

答案 4 :(得分:6)

有趣的是,我认为同样的方法适用于PATCHing多个实体,并且需要考虑我们对URL,参数和REST方法的含义。

  1. 返回所有'foo'元素:

    [GET] api/foo

  2. 返回'foo'元素并过滤特定ID:

    [GET] api/foo?ids=3,5,9

  3. 其中感觉是URL,过滤器确定“我们正在处理什么元素?”,REST方法(在本例中为“GET”)说“如何处理这些元素?”

    1. 因此,PATCH多条记录将其标记为已读

      [PATCH] api/foo?ids=3,5,9

    2. ..数据foo [read] = 1

      1. 最后要删除多条记录,此端点最符合逻辑:

        [DELETE] api/foo?ids=3,5,9

      2. 请理解我不相信这有任何“规则” - 对我来说它只是“有道理”

答案 5 :(得分:1)

正如Decent Dabbler answerrojocas answer所说,最典型的做法是使用虚拟资源来删除资源的选择,但是从REST的角度来看,我认为这是不正确的,因为执行DELETE http://example.com/resources/selections/DF4XY7应该删除选择资源本身,而不是选择的资源。

采用Maciej Piechotka anwserfezfox answer,我只有一个反对意见:还有一种更规范的方式来传递ID数组,并使用数组运算符:

DELETE /api/resources?ids[]=1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d&ids[]=7e8f9a0b-1c2d-3e4f-5a6b-7c8d9e0f1a2b

通过这种方式,您正在攻击Delete Collection端点,但以正确的方式使用查询字符串过滤删除。

答案 6 :(得分:0)

由于没有'正确'的方法,我过去所做的是:

使用正文中的xml或json编码数据将DELETE发送到http://example.com/something

当您收到请求时,检查DELETE,如果为true,则读取正文以查找要删除的请求。

答案 7 :(得分:0)

我在删除多个项目时遇到相同的情况。这就是我最终要做的。我使用了DELETE操作,要删除的项目ID是HTTP标头的一部分。