对于REST风格的web服务中的资源,有哪些经过验证的设计模式用于批处理操作?
在性能和稳定性方面,我试图在理想和现实之间取得平衡。我们现在有一个应用程序接口,所有的操作要么从列表资源中检索(例如: GET /user),要么在单个实例上检索(PUT /user/1、DELETE /user/22等)。
在某些情况下,您希望更新整个对象集的单个字段。来回发送每个对象的整个表示来更新一个字段似乎非常浪费。
在RPC风格的API中,您可以使用以下方法:
/mail.do?method=markAsRead&messageIds=1,2,3,4... etc. 这里剩下的等价物是什么?或者时不时地妥协也没问题。添加一些真正提高性能的特定操作是否会破坏设计,等等?在所有情况下,现在的客户端都是Web浏览器(客户端的javascript应用程序)。
发布于 2009-10-27 21:44:24
批处理的一种简单的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=junkRESTful的创造力是巨大的。
发布于 2018-05-17 05:34:13
从我的角度来看,我认为Facebook有最好的实现。
一个HTTP请求带有一个批处理参数和一个令牌参数。
成批地发送json。它包含一个“请求”的集合。每个请求都有一个方法属性(get / post / put / delete /Ett...)和一个relative_url属性(端点的uri),此外,post和put方法还允许一个"body“属性,要更新的字段将发送到该属性。
更多信息请访问:Facebook batch API
发布于 2009-02-04 14:22:12
在类似于您的示例中的操作中,我很想编写一个范围解析器。
制作一个可以读取"messageIds=1-3,7-9,11,12-15“的解析器并不是很麻烦。它肯定会提高覆盖所有消息的综合操作的效率,并且更具可伸缩性。
https://stackoverflow.com/questions/511281
复制相似问题