繁体   English   中英

如何编写删除 REST API 接受一长串要删除的项目?

[英]How to write delete REST API that accepts a long list of items to delete?

我正在编写 RESTful API,并且习惯了使用 HTTP 动词进行不同操作的推荐协议。

但是,我不确定这些协议如何处理您删除可能很长的项目列表的情况。

看起来,像 GET 一样,DELETE 动词没有主体,因此仅限于 URL 的长度。 那么你怎么能支持接受任意长的要删除的项目列表呢?

从一开始....

HTTP是我们的自描述消息标准,受统一接口约束 这反过来意味着 web 上的每个人都以相同的方式理解 HTTP 请求。

换句话说

DELETE /api/users/5b45eda8-067c-42c1-ae1b-e0f82ad736d6

具有相同的含义

DELETE /www/home.html

在这两种情况下,我们都要求服务器对其资源 model进行更改。

因为每个人都以相同的方式理解这些请求,所以我们可以创建通用组件(例如:缓存),这些组件可以理解在网络域上传输文档时消息的含义,因此可以做一些智能的事情(比如使以前缓存的响应无效)。

即使通用组件对资源的语义一无所知,对隐藏在资源后面的底层域 model 一无所知,我们也可以做到这一点。

DELETE,在 HTTP 中,始终指定单个目标 URI; “批量删除”在这里不是一个选项。

(我还没有找到任何已注册的 HTTP 方法来描述对通用组件的批量删除。可能其中一种 WebDAV 方法可以表达这些语义,但 WebDAV 标准也有很多其他包袱 - 我不会尝试将这些方法重新用于“正常”API。)

因此,如果您尝试删除 API 中的三个资源,那么您将需要三个请求来执行此操作 - 就像您尝试删除 web 站点上的三个页面一样。


也就是说,如果使用单个 HTTP 请求删除 web 站点上的一堆资源比让通用组件了解正在发生的事情更重要:您可以选择使用 POST

POST 在 HTTP 中有许多有用的用途,包括“此操作不值得标准化”的一般用途。 ——菲尔丁,2009

通用组件将了解目标 URI 标识的资源正在以某种方式发生变化,但它不会了解有效负载中发生的情况。

理论上,您可以标准化表示“我们正在删除所有这些资源”的有效负载,然后可以实现通用组件来识别该标准。 在实践中,祝你好运。


现在,如果您想要的是批量删除域中的实体 model ,那么您有一些可用的选项。

在 web 上,我们通常会使用类似表格的东西——也许每个实体都有一个复选框。 您 select 要删除的实体,提交表单,然后 HTTP 请求处理程序解析消息,然后将信息转发到您的域 model。

您可以使用远程创作习语来实现类似的目标 - 这是一个资源,其表示形式是实体列表。 您将删除实体的该文档的副本放入服务器,然后在服务器上更改域 model 以匹配。

这是一种非常声明性的方法:“更改域 model 以便资源的表示看起来像这样”。

这类似于您如何使用 HTTP 修复 web 页面中的拼写错误:使用新的 HTML 发送 PUT 请求(包括请求正文中的拼写更正)。

PATCH 的想法非常相似:我们描述对资源表示的更改,然后服务器将该信息传递给域 model。 这里的不同之处在于,我们不是发送整个表示,而是发送一个描述更正的补丁文档。

如果您想要一种命令式方法 - 只需使用 POST

POST /Bob
Content-Type: text/plain

Bob,
Please delete domain entities 1, 2, 5, 7

通用组件不会理解您尝试修改目标资源的方式,但它们至少会知道这么多。


当有很多资源的表示依赖于相同的资源时,事情就会变得混乱。 这些标准并没有为我们提供太多的可供性方式来宣布“这里是所有已更改的资源”。

缓存失效是两个难题之一。 HTTP 有一些适用于简单情况的可供性,但当事情变得更复杂时,权衡变得必要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM