用于删除一组项的Restful方法
在 这表明,如果使用DELETE,则意味着您正在删除整个集合 如果使用DELETE,则表示正在删除该元素 我在做一个网站,注意不是网络服务 我有一个列表,列表中的每个项目都有一个复选框。一旦我选择了多个要删除的项目,我将允许用户按下一个名为DELETE SELECTION的按钮。如果用户按下按钮,将弹出一个js对话框,要求用户确认删除。如果用户确认,则删除所有项目 那么,我应该如何以RESTFUL方式删除多个项目呢用于删除一组项的Restful方法,rest,Rest,在 这表明,如果使用DELETE,则意味着您正在删除整个集合 如果使用DELETE,则表示正在删除该元素 我在做一个网站,注意不是网络服务 我有一个列表,列表中的每个项目都有一个复选框。一旦我选择了多个要删除的项目,我将允许用户按下一个名为DELETE SELECTION的按钮。如果用户按下按钮,将弹出一个js对话框,要求用户确认删除。如果用户确认,则删除所有项目 那么,我应该如何以RESTFUL方式删除多个项目呢 注意,目前对于网页中的删除,我所做的是使用表单标记和POST as action
注意,目前对于网页中的删除,我所做的是使用表单标记和POST as action,但包括一个_方法,该方法的值为DELETE since。一个选项是创建一个删除“事务”。因此,您将
发布到类似http://example.com/resources/deletes
由要删除的资源列表组成的新资源。然后在应用程序中,只需执行删除操作。当您发布时,您应该返回您创建的事务的位置,例如,http://example.com/resources/deletes/DF4XY7
。获取此信息可以返回事务的状态(完成或进行中)和/或要删除的资源列表。我可以说是删除或删除。正如“REST是一种架构(…)[不是]协议”引用这篇维基百科文章所说的那样,我相信,没有一种方法可以做到这一点
我知道如果没有带HTML的JS,上述内容是不可能的,但我感觉REST是:
- 创建时不考虑事务等小细节。谁将需要对不止一个项目进行操作?这在HTTP协议中是合理的,因为除了静态网页之外,它不打算通过它提供任何其他服务
- 没有必要很好地适应当前的模型——即使是纯HTML
由于没有“适当”的方法来做到这一点,我过去所做的是:
在正文中使用xml或json编码的数据将DELETE发送到
当您收到请求时,检查DELETE,如果为true,则读取要删除的请求的正文 我认为是目前为止最好的。一个微小的变化可能是,在同一页面上取消javascript确认,而是创建选择并重定向到它,在该页面上显示确认消息。换言之:
发件人:
做一个
将所选ID发布到:
如果成功,应以以下方式回应:
已创建HTTP/1.1 201,并将位置标头发送到:
在此页面上,您将看到一个(javascript)确认框,如果您确认,该框将执行以下请求:
删除
如果成功,应以以下方式回应:
HTTP/1.1 200 Ok(或任何适合成功删除的方法)有趣的是,我认为相同的方法适用于修补多个实体,需要考虑我们的URL、参数和REST方法的含义
返回所有“foo”元素:
[GET]api/foo
返回带有特定ID筛选的“foo”元素:
[GET]api/foo?ids=3,5,9
其中,sense是URL,过滤器确定“我们正在处理哪些元素?”,REST方法(在本例中为“GET”)表示“如何处理这些元素?”
因此,修补多个记录以将其标记为已读
[PATCH]api/foo?ids=3,5,9
..数据foo[read]=1
最后,要删除多条记录,此端点最符合逻辑:
[DELETE]api/foo?ids=3,5,9
请理解,我不认为在这方面有任何“规则”-对我来说,这只是“有意义的”以下是Amazon使用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))
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
请求:
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>
批量请求:
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
正如和所说,最规范的方法是使用虚拟资源来删除资源选择,但我认为从REST的角度来看这是不正确的,因为执行deletehttp://example.com/resources/selections/DF4XY7
应删除选择资源本身,而不是所选资源
对于or,我只有一个异议:传递ID数组有一种更规范的方法,使用数组运算符:
DELETE/api/resources?id[]=1a2b3c4d-5e6f-7a8b-9c0d-1E2F3A4-B5C6D&id[]=7e8f9a0b-1c2d-3e4f-5a6b-7c8d9e0f1a2b
通过这种方式,您攻击的是删除集合终结点,但以正确的方式使用查询字符串过滤删除。我也遇到过删除多个项目的相同情况。这就是我最后做的。我使用了删除操作,要删除的项目的ID是HTTP头的一部分 以原子方式执行这些删除是否至关重要?如果第31个项目无法删除,您真的想取消前30个项目的删除吗?@Darreller问得好。我认为如果以原子方式执行删除,效率会降低。因此,我倾向于从tablename中删除ID({list of ID})。如果有人能告诉我这是个好主意还是纠正我。我们将不胜感激。此外,如果删除了第21个项目,我不要求前20个项目的删除顺序相反。如果有人能告诉我需要反转与不需要反转方法的区别,我再次表示感谢。注意:“in”条款可能有限制;例如,在Oracle中,最多可以放置1000个ID。Google的API设计指南提供了一种在REST API中创建自定义(批处理)操作的解决方案,请参见我的回答:与数据库无关。我所说的事务只是指要执行的操作列表。在本例中,它是一个删除列表。您要做的是在应用程序中创建一个新的(删除)列表作为资源。您的web应用程序可以以任何方式处理该列表