使用REST删除多个logging
什么是删除多个项目的REST方式?
我的用例是我有一个骨干集合,我需要能够一次删除多个项目。 选项似乎是:
- 为每一条logging发送一个DELETE请求(如果有潜在的几十个项目,这似乎是一个坏主意);
- 发送一个DELETE,其中要删除的ID在URL中串联在一起(即“/ records / 1; 2; 3”);
- 以非REST方式发送包含标记为删除的ID的自定义JSON对象。
所有选项都不尽如人意。
这似乎是REST约定的一个灰色区域。
- 是一个可行的RESTful的select,但显然有限制,如你所描述的。
- 不要这样做。 这将被中间人解释为“删除(单个)资源在
/records/1;2;3
” – 所以对此的2xx响应可能会导致他们清除/records/1;2;3
; 不清除/records/1
,/records/2
或/records/3
; 代理/records/1;2;3
的410响应,或从您的angular度来看没有意义的其他事情。 - 这个select是最好的,可以做到REST风格。 如果你正在创build一个API,并且你想允许对资源进行大规模的改变,你可以使用REST来做到这一点,但是对于很多人来说,这并不明显。 一种方法是创build一个“更改请求资源” (例如通过发送一个正文,如
records=[1,2,3]
到/delete-requests
),并轮询创build的资源(由响应的Location
标题指定)了解您的请求是否被接受,拒绝,正在进行或已经完成。 这对于长时间运行操作非常有用。 另一种方法是将PATCH
请求发送到列表资源/records
,其中的主体包含资源列表和要在这些资源上执行的操作(以您希望支持的任何格式)。 这对快速操作很有用,其中请求的响应代码可以指示操作的结果。
一切都可以在REST的约束下实现,通常的答案是把“问题”变成一个资源,并给它一个URL。
因此,可以通过创build“批处理操作”列表并将新操作发布到批处理操作(如在此处删除,或将多个项目张贴到列表中,或者对大量资源进行相同编辑)来处理。
别忘了,REST不是解决任何问题的唯一方法。 “rest”只是一种build筑风格,你不必坚持(但是如果你不这样做,你会失去某些互联网的好处)。 我build议你看看这个HTTP API架构列表,并select一个适合你的。 只要让自己意识到,如果你select另一种架构,你就会失去什么,并根据你的使用情况做出明智的决定。
对于在REST Web服务中处理批量操作的模式,这个问题有一些不好的答案? 有太多的赞扬,但也应该读。
如果GET /records?filteringCriteria
返回与条件匹配的所有logging的数组,则DELETE /records?filteringCriteria
可以删除所有这些logging。
在这种情况下,您的问题的答案是DELETE /records?id=1&id=2&id=3
。
我已经允许批发更换一个集合,例如PUT ~/people/123/shoes
,其中主体是整个集合表示。
这适用于客户想要查看项目的小项子集,并删除一些项并添加其他项,然后更新服务器。 他们可以把一个空的集合删除所有。
这意味着GET ~/people/123/shoes/9
仍然会保留在caching中,即使一个PUT删除了它,但这只是一个caching问题,如果其他人删除了这个鞋,这将是一个问题。
我的数据/系统API总是使用ETags而不是到期时间,所以服务器在每个请求上都被命中,并且我需要正确的版本/并发头来改变数据。 对于只读和查看/报告alignment的API,我使用过期时间来减less原点击次数,例如,排行榜可以持续10分钟。
对于更大的集合,像~/people
,我倾向于不需要多次删除,用例往往不会自然出现,所以单个DELETE工作正常。
在将来,从构buildREST API和碰到相同的问题和需求(比如审计)的经验来看,我倾向于只使用GET和POST动词并围绕事件进行devise,例如,POST地址事件的更改,尽pipe我怀疑会有自己的一套问题:)
我还允许前端开发人员构build自己的API,使用更严格的后端API,因为为什么他们不喜欢严格的“Fielding狂热”REST APIdevise以及生产力和caching分层的原因。