Java 如何设计批量GET调用?
设计API以促进批量GET请求的最佳方法是什么?我有一个用例,我想将多个实体返回到一个服务,而不想对每个资源进行一次GET调用。有一个资源返回多个实体的表示就可以了。想想谷歌的搜索结果,堆栈溢出中的问题,亚马逊过去的订单Java 如何设计批量GET调用?,java,rest,Java,Rest,设计API以促进批量GET请求的最佳方法是什么?我有一个用例,我想将多个实体返回到一个服务,而不想对每个资源进行一次GET调用。有一个资源返回多个实体的表示就可以了。想想谷歌的搜索结果,堆栈溢出中的问题,亚马逊过去的订单 您确实需要了解缓存失效的含义。看见基本问题是,就通用组件而言,不同的资源是不相关的——使一个无效不会改变其他资源(在有限的情况下除外)。如果在两个不同的API键下缓存“相同”的信息,则可能会导致不一致。使用一个资源返回多个实体的表示就可以了。想想谷歌的搜索结果,堆栈溢出中的问题
您确实需要了解缓存失效的含义。看见基本问题是,就通用组件而言,不同的资源是不相关的——使一个无效不会改变其他资源(在有限的情况下除外)。如果在两个不同的API键下缓存“相同”的信息,则可能会导致不一致。使用一个资源返回多个实体的表示就可以了。想想谷歌的搜索结果,堆栈溢出中的问题,亚马逊过去的订单
您确实需要了解缓存失效的含义。看见基本问题是,就通用组件而言,不同的资源是不相关的——使一个无效不会改变其他资源(在有限的情况下除外)。如果在两个不同的API键下缓存“相同”的信息,可能会导致不一致。这是HTTP API的常见任务。因此,有两种普遍的解决方案 可以说,最常见的是使用
POST
请求。在POST
请求的正文中,您应该指定您提出的请求类型和请求内容。您应该在请求中给出一个类型,因为POST
只是一个一般请求,服务器执行负载中给出的任何操作
例如:
POST /resources
Content-Type: application/json
{
"action": "get",
"ids": [
1,
2,
3
]
}
另一个选项是带有主体的GET
请求。该请求可能与上面的POST
请求类似,但不需要指定操作。您可以在项目中看到这种方法,例如。当涉及到具有主体的GET
请求时,HTTP规范的定义很模糊(请参阅)
RFC特别指出:
GET请求消息中的有效负载没有定义的语义;
在GET请求上发送有效负载正文可能会导致某些现有错误
实现拒绝请求
虽然我不能代表ElasticSearch的开发人员发言,但我认为引用的最后一部分(“某些现有实现[可能]拒绝请求”)是ElasticSearch同时接受批量请求的
GET
和POST
请求的原因之一,这是HTTP API的常见任务。因此,有两种普遍的解决方案
可以说,最常见的是使用POST
请求。在POST
请求的正文中,您应该指定您提出的请求类型和请求内容。您应该在请求中给出一个类型,因为POST
只是一个一般请求,服务器执行负载中给出的任何操作
例如:
POST /resources
Content-Type: application/json
{
"action": "get",
"ids": [
1,
2,
3
]
}
另一个选项是带有主体的GET
请求。该请求可能与上面的POST
请求类似,但不需要指定操作。您可以在项目中看到这种方法,例如。当涉及到具有主体的GET
请求时,HTTP规范的定义很模糊(请参阅)
RFC特别指出:
GET请求消息中的有效负载没有定义的语义;
在GET请求上发送有效负载正文可能会导致某些现有错误
实现拒绝请求
虽然我不能代表ElasticSearch的开发人员发言,但我希望引用的最后一部分(“一些现有的实现[可能]拒绝该请求”)ElasticSearch同时接受批量请求的
GET
和POST
请求,这是原因之一我认为这正在成为Data-as-a-service下的一个常见用例,在Data-as-a-service中,存在批量请求进行GET操作或POST(CUD)操作。架构的选择将由多个因素决定
我的回答仅基于数据量因素:
对于较小的卷,单个节点/服务器可以完成给定的请求,但如果您试图“查询”或“更新”数千或数百万条记录,该怎么办。这种情况可能需要将工作负载分配给多个工作节点,因此异步、事件驱动、容器化、消息传递的设置可能更合适
示例:
您可以向服务器发送一个请求,服务器可以将工作负载分配给多个工作人员,然后,每个工作者将响应发布到队列中,原始客户端可以在一段时间后从该队列中获取结果。我认为这正在成为Data-as-a-service下的一个常见用例,在Data-as-a-service中,存在对GET操作或POST(CUD)操作的批量请求。架构的选择将由多个因素决定 我的回答仅基于数据量因素: 对于较小的卷,单个节点/服务器可以完成给定的请求,但如果您试图“查询”或“更新”数千或数百万条记录,该怎么办。这种情况可能需要将工作负载分配给多个工作节点,因此异步、事件驱动、容器化、消息传递的设置可能更合适 示例:
您可以向服务器发送一个请求,服务器可以将工作负载分配给多个工作人员,然后,每个工作进程将响应发布到队列中,原始客户端可以从队列中经过一段时间后获取结果。您可以公开新的端点,该端点使用参数列表查找并返回所有一次性GOT。用于按适当条件进行实体筛选的查询参数应该可以工作。请记住