首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在REST web服务中处理批处理操作的模式?

在REST web服务中处理批处理操作的模式?
EN

Stack Overflow用户
提问于 2009-02-04 13:13:35
回答 4查看 89K关注 0票数 180

对于REST风格的web服务中的资源,有哪些经过验证的设计模式用于批处理操作?

在性能和稳定性方面,我试图在理想和现实之间取得平衡。我们现在有一个应用程序接口,所有的操作要么从列表资源中检索(例如: GET /user),要么在单个实例上检索(PUT /user/1、DELETE /user/22等)。

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

在RPC风格的API中,您可以使用以下方法:

代码语言:javascript
复制
/mail.do?method=markAsRead&messageIds=1,2,3,4... etc. 

这里剩下的等价物是什么?或者时不时地妥协也没问题。添加一些真正提高性能的特定操作是否会破坏设计,等等?在所有情况下,现在的客户端都是Web浏览器(客户端的javascript应用程序)。

EN

回答 4

Stack Overflow用户

发布于 2009-10-27 21:44:24

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

代码语言:javascript
复制
DELETE /mail?&id=0&id=1&id=2

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

代码语言:javascript
复制
POST /mail?markAsRead=true
POSTDATA: ids=[0,1,2]

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

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

代码语言:javascript
复制
POST /mail?category=junk
POSTDATA: ids=[0,1,2]

显然,做iTunes风格的批量部分更新要复杂得多(例如,artist+albumTitle而不是trackTitle)。桶的类比开始被打破。

代码语言:javascript
复制
POST /mail?markAsRead=true&category=junk
POSTDATA: ids=[0,1,2]

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

代码语言:javascript
复制
POST /mail/0/markAsRead
POSTDATA: true

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

更新几个属性,几个资源:

代码语言:javascript
复制
POST /mail/0;1;2/markAsRead;category
POSTDATA: markAsRead=true,category=junk

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

代码语言:javascript
复制
POST /mail/0;1;2/markAsRead
POSTDATA: true

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

代码语言:javascript
复制
POST /mail/0/markAsRead;category
POSTDATA: markAsRead=true,category=junk

RESTful的创造力是巨大的。

票数 81
EN

Stack Overflow用户

发布于 2018-05-17 05:34:13

从我的角度来看,我认为Facebook有最好的实现。

一个HTTP请求带有一个批处理参数和一个令牌参数。

成批地发送json。它包含一个“请求”的集合。每个请求都有一个方法属性(get / post / put / delete /Ett...)和一个relative_url属性(端点的uri),此外,post和put方法还允许一个"body“属性,要更新的字段将发送到该属性。

更多信息请访问:Facebook batch API

票数 2
EN

Stack Overflow用户

发布于 2009-02-04 14:22:12

在类似于您的示例中的操作中,我很想编写一个范围解析器。

制作一个可以读取"messageIds=1-3,7-9,11,12-15“的解析器并不是很麻烦。它肯定会提高覆盖所有消息的综合操作的效率,并且更具可伸缩性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/511281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档