用于删除大量项目的宁静方式

在针对 REST 的 wiki 文章 < a href = “ http://en.wikipedia.org/wiki/Reporting ational _ State _ Transfer”rel = “ noReferrer”> wiki article for REST 中 指示如果使用 http://example.com/resources DELETE,则表示正在删除整个集合。

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

我正在做一个网站,注意不是网络服务。

I have a list that has 1 checkbox for each item on the list. Once i select multiple items for deletion, i will allow users to press a button called DELETE SELECTION. If user presses the button, a js dialog box will popup asking user to confirm the deletion. if user confirms, all the items are deleted.

So how should i cater for deleting multiple items in a RESTFUL way?

注意,目前对于网页中的 DELETE,我所做的是使用 FORM 标记和 POST 作为操作,但是从 这就是其他人在如何对网页进行 RESTful 删除时给出的指示开始包含一个值为 DELETE 的 _ 方法。

82925 次浏览

一种选择是创建一个删除“事务”。因此,您将 POST转换为类似于 http://example.com/resources/deletes的新资源,该资源由要删除的资源列表组成。然后在应用程序中执行删除操作。当你做文章时,你应该返回你创建的事务的位置,例如,http://example.com/resources/deletes/DF4XY7。在此基础上的 GET可以返回事务的状态(完成或进行中)和/或要删除的资源列表。

I would say DELETE http://example.com/resources/id1,id2,id3,id4 or DELETE http://example.com/resources/id1+id2+id3+id4. As "REST is an architecture (...) [not] protocol" to quote this wikipedia article there is, I believe, no single one way of doing this.

我知道没有带 HTML 的 JS 上面的内容是不可能的,但是我感觉 REST 是:

  • 创建时不考虑交易等次要细节。谁会需要操作更多的单一项目?这在 HTTP 协议中是合理的,因为它不打算通过它服务除静态网页之外的任何其他东西。
  • 没有必要很好地适应当前的模型——即使是纯 HTML 模型。

由于没有“正确”的方法来做到这一点,我过去所做的是:

send DELETE to http://example.com/something with xml or json encoded data in the body.

when you receive the request, check for DELETE, if true, then read the body for the ones to be deleted.

我认为 Rojoca 的回答是目前为止最好的。一个小小的变化可能是,去掉同一页面上的 javascript 确认,相反,创建选择并重定向到它,在该页面上显示确认消息。换句话说:

来自:
Http://example.com/resources/

做一个

邮件的 ID 选择为:
Http://example.com/resources/selections

如果成功的话,应该回应如下:

创建了 HTTP/1.1201,并创建了一个 Location 标题:
Http://example.com/resources/selections/df4xy7

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

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

如果成功的话,应该回应如下: HTTP/1.1200 OK (或任何适合于成功删除的内容)

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

  1. 返回所有“ foo”元素:

    [GET] api/foo

  2. 返回“ foo”元素并过滤特定的 id:

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

在这个意义上,URL 和过滤器决定了“我们处理的是什么元素?”REST 方法(在本例中是“ GET”)说“如何处理这些元素?”

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

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

. . 用数据 foo [ read ] = 1

  1. Finally to delete multiple records, this endpoint is most logical:

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

请理解,我不相信有任何“规则”-对我来说,它只是“有意义”

下面是亚马逊对他们的 S3RESTAPI 所做的工作。

个人删除请求:

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))

多对象删除请求:

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 API解析服务器 REST APIGoogle Drive REST API更进一步,它们允许您在一个请求中“批处理”单个操作。

下面是来自 Parse Server 的一个示例。

Individual delete request:

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

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

对于 Maciej Piechotka 回答或者 Fezfox 回答,我只有一个反对意见: 有一种更规范的方法来传递 id 数组,那就是使用数组操作符:

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

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

我有同样的情况删除多个项目。这就是我最后所做的。我使用了 DELETE 操作,将要删除的条目的 id 是 HTTP 头部的一部分。