删除多个项目的 REST-ful 方式是什么?
我的用例是,我有一个骨干集合,其中我需要能够删除多个项目一次。选择似乎是:
所有的选择都不理想。
这似乎是 REST 约定的一个灰色地带。
/records/1;2;3
/records/1
/records/2
/records/3
records=[1,2,3]
/delete-requests
Location
PATCH
/records
任何事情都可以在保持 REST 约束的情况下实现,通常的答案是将“问题”变成一个资源,并给它一个 URL。 因此,可以通过创建一个“批处理操作”列表并向其发布新操作来处理批处理操作,比如在此处删除、将多个项目发布到一个列表中、或对一个资源区域进行相同的编辑。
不要忘记,REST 不是解决任何问题的唯一方法。“ REST”只是一种架构风格,你不必遵循 有(但是如果你不这样做,你就会失去互联网的某些好处)。我建议你看看这个 HTTP API 架构列表,选择一个适合你的。只要让自己意识到如果选择其他体系结构会失去什么,并根据用例做出明智的决定。
在 在 REST Web 服务中处理批处理操作的模式?上有一些关于这个问题的错误答案,它们有太多的赞成票,但是也应该被阅读。
如果 GET /records?filteringCriteria返回匹配条件的所有记录的数组,那么 DELETE /records?filteringCriteria可以删除所有这些记录。
GET /records?filteringCriteria
DELETE /records?filteringCriteria
在这种情况下,你的问题的答案将是 DELETE /records?id=1&id=2&id=3。
DELETE /records?id=1&id=2&id=3
我已经允许对集合进行大规模替换,例如 PUT ~/people/123/shoes,其中主体是整个集合表示。
PUT ~/people/123/shoes
这适用于客户机希望检查项目的小子集合,并删除一些项目,添加一些其他项目,然后更新服务器。他们可以放置一个空集合来删除所有。
这将意味着即使 PUT 删除了 GET ~/people/123/shoes/9,它仍然会保留在缓存中,但这只是一个缓存问题,如果其他人删除了鞋子,这将是一个问题。
GET ~/people/123/shoes/9
我的数据/系统 API 总是使用 ETags,而不是过期时间,因此每个请求都会命中服务器,并且我需要正确的版本/并发报头来更改数据。对于只读和查看/报告对齐的 API,我确实使用到期时间来减少对原始 API 的命中,例如排行榜可以保持10分钟。
对于更大的集合,比如 ~/people,我倾向于不需要多次删除,用例倾向于不会自然产生,因此单个 DELETE 工作得很好。
~/people
以后,根据构建 REST API 的经验和遇到相同问题和需求的经验,比如审计,我倾向于只使用 GET 和 POST 动词,并围绕事件进行设计,比如 POST 地址更改事件,尽管我怀疑这会带来一系列问题:)
我还允许前端开发人员构建他们自己的 API,这些 API 使用更严格的后端 API,因为他们不喜欢严格的“ Fielding 狂热者”REST API 设计的原因通常是实用的、有效的客户端原因,以及生产率和缓存分层的原因。
我认为 Mozilla 存储服务 SyncStorage API v1.5是使用 REST 删除多条记录的好方法。
DELETE https://<endpoint-url>/storage/<collection>
DELETE https://<endpoint-url>/storage/<collection>?ids=<ids>
Id : 从集合中删除 BSO,这些集合的 id 位于所提供的逗号分隔列表中。最多可以提供100个 id。
DELETE https://<endpoint-url>/storage/<collection>/<id>
Http://moz-services-docs.readthedocs.io/en/latest/storage/apis-1.5.html#api-instructions
是的,到目前为止,我只碰到过一个提到批处理操作(比如批处理删除)的 REST API 设计指南: 谷歌 API 设计指南。
本指南 提到创建“自定义”方法,这些方法可以通过使用冒号(例如 https://service.name/v1/some/resource/name:customVerb)通过资源关联,它还明确提到批处理操作作为用例:
https://service.name/v1/some/resource/name:customVerb
自定义方法可以与资源、集合或服务关联。它可以接受任意请求并返回任意响应,还支持流请求和响应。[ ... ]自定义方法应该使用 HTTP POST 谓词,因为它具有最灵活的语义[ ... ]对于性能关键的方法,它可能是有用的 提供自定义批处理方法以减少每个请求的开销。
所以你可以根据谷歌的 API 指南做以下事情:
POST /api/path/to/your/collection:batchDelete
... 删除您的收集资源的一堆项目。
您可以发布一个已删除的资源:) POST /deleted-records 尸体就会 {"ids": [1, 2, 3]}
POST /deleted-records
{"ids": [1, 2, 3]}