在REST中批处理

时间:2020-03-06 14:29:35  来源:igfitidea点击:

使用Web服务时,将多个服务调用批处理为一条消息以减少远程调用的数量被认为是一种好习惯。 RESTful服务有什么办法做到这一点?

解决方案

当然有办法,但是需要服务器端支持。没有一种神奇的方法可以适应我所知道的所有方法。

我看不到批处理请求在REST中如何有意义。由于基于REST的服务中的URL表示要执行的操作和执行该操作的数据,因此进行批处理请求将严重破坏概念模型。

如果我们多次对相同的数据执行相同的操作,将是一个例外。在这种情况下,我们可以为请求参数传递多个值,也可以在主体中对此重复进行编码(但是,此重复仅对PUT或者POST有效)。 Gliffy REST API支持通过以下方式将多个用户添加到同一文件夹中

POST /folders/ROOT/the/folder/name/users?userId=56&userId=87&userId=45

本质上是:

PUT /folders/ROOT/the/folder/name/users/56
PUT /folders/ROOT/the/folder/name/users/87
PUT /folders/ROOT/the/folder/name/users/45

正如其他评论者所指出的那样,可以通过请求参数来完成GET的分页结果:

GET /some/list/of/resources?startIndex=10&pageSize=50

REST服务是否支持它。

如果我们确实需要进行批处理,则Http 1.1支持称为HTTP Pipelining的概念,该概念使我们可以在收到响应之前发送多个请求。在这里查看

我同意达雷尔·米勒(Darrel Miller)的观点。 HTTP已经支持HTTP管道传输,加上HTTP支持保持活动状态,使我们可以在同一套接字上同时流式传输多个HTTP操作,从而避免了在将新请求流式传输到服务器等之前必须等待响应。

因此,使用HTTP流水线并保持活动状态,我们可以在使用相同的基础REST API的同时获得批处理的效果,因此通常无需在服务中使用其他REST API

与Astoria的团队很好地利用了多部分哑剧来发送一批电话。与流水线不同,因为多部分消息可以推断出原子操作的意图。似乎比较优雅。

  • 原始博客文章解释理性
  • MSDN文档