gpt4 book ai didi

web-services - 在 REST Web 服务中处理批量操作的模式?

转载 作者:行者123 更新时间:2023-12-03 04:17:33 25 4
gpt4 key购买 nike

对于 REST 风格 Web 服务中的资源进行批量操作,存在哪些经过验证的设计模式?

我正在努力在性能和稳定性方面在理想和现实之间取得平衡。我们现在有一个 API,其中所有操作要么从列表资源中检索(即:GET/user),要么在单个实例上检索(PUT/user/1、DELETE/user/22 等)。

在某些情况下,您想要更新整组对象的单个字段。来回发送每个对象的整个表示来更新一个字段似乎非常浪费。

在 RPC 风格的 API 中,您可以有一个方法:

/mail.do?method=markAsRead&messageIds=1,2,3,4... etc. 

这里的 REST 等价物是什么?或者偶尔妥协一下也可以。添加一些真正提高性能等的特定操作是否会破坏设计?现在所有情况下的客户端都是 Web 浏览器(客户端的 JavaScript 应用程序)。

最佳答案

一个简单的批处理 RESTful 模式是利用集合资源。例如,一次删除多条消息。

DELETE /mail?&id=0&id=1&id=2

批量更新部分资源,或者说资源属性,稍微复杂一些。即,更新每个markedAsRead 属性。基本上,您不是将属性视为每个资源的一部分,而是将其视为放置资源的存储桶。已经发布了一个示例。我稍微调整了一下。

POST /mail?markAsRead=true
POSTDATA: ids=[0,1,2]

基本上,您正在更新标记为已读的邮件列表。

您还可以使用它来将多个项目分配到同一类别。

POST /mail?category=junk
POSTDATA: ids=[0,1,2]

执行 iTunes 风格的批量部分更新显然要复杂得多(例如,artist+albumTitle 但不是 trackTitle)。水桶的比喻开始失效。

POST /mail?markAsRead=true&category=junk
POSTDATA: ids=[0,1,2]

从长远来看,更新单个部分资源或资源属性要容易得多。只需使用子资源即可。

POST /mail/0/markAsRead
POSTDATA: true

或者,您可以使用参数化资源。这在 REST 模式中不太常见,但在 URI 和 HTTP 规范中是允许的。分号在资源内水平划分相关参数。

更新多个属性、多个资源:

POST /mail/0;1;2/markAsRead;category
POSTDATA: markAsRead=true,category=junk

更新多个资源,仅更新一个属性:

POST /mail/0;1;2/markAsRead
POSTDATA: true

更新多个属性,仅更新一个资源:

POST /mail/0/markAsRead;category
POSTDATA: markAsRead=true,category=junk

RESTful 创造力比比皆是。

关于web-services - 在 REST Web 服务中处理批量操作的模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/511281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com