在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。
答案 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))
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,Parse Server REST API和Google 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是:
答案 4 :(得分:6)
有趣的是,我认为同样的方法适用于PATCHing多个实体,并且需要考虑我们对URL,参数和REST方法的含义。
返回所有'foo'元素:
[GET] api/foo
返回'foo'元素并过滤特定ID:
[GET] api/foo?ids=3,5,9
其中感觉是URL,过滤器确定“我们正在处理什么元素?”,REST方法(在本例中为“GET”)说“如何处理这些元素?”
因此,PATCH多条记录将其标记为已读
[PATCH] api/foo?ids=3,5,9
..数据foo [read] = 1
最后要删除多条记录,此端点最符合逻辑:
[DELETE] api/foo?ids=3,5,9
请理解我不相信这有任何“规则” - 对我来说它只是“有道理”
答案 5 :(得分:1)
正如Decent Dabbler answer和rojocas answer所说,最典型的做法是使用虚拟资源来删除资源的选择,但是从REST的角度来看,我认为这是不正确的,因为执行DELETE http://example.com/resources/selections/DF4XY7
应该删除选择资源本身,而不是选择的资源。
采用Maciej Piechotka anwser或fezfox 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标头的一部分。