有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何设计批量GET调用?

设计API以促进批量GET请求的最佳方法是什么?我有一个用例,我希望将多个实体返回到一个服务,而不希望对每个资源进行一次GET调用


共 (3) 个答案

  1. # 1 楼答案

    拥有一个返回多个实体表示的资源是很好的。想想谷歌的搜索结果,堆栈溢出中的问题,亚马逊过去的订单

    您确实需要了解缓存失效的含义。见RFC 7234。基本问题是,就通用组件而言,不同的资源是不相关的,使一个资源失效不会改变其他资源(在有限的情况下除外)。如果在两个不同的API键下缓存“相同”的信息,可能会导致不一致

  2. # 2 楼答案

    这是HTTP API的常见任务。因此,有两种普遍的解决方案

    可以说,最常见的是使用POST请求。在POST请求的主体中,您应该指定您正在发出的请求的类型,以及您正在请求的内容。您应该在请求中给出一个类型,因为POST只是一个一般请求,服务器执行负载中给出的任何操作

    例如:

    POST /resources
    Content-Type: application/json
    
    {
      "action": "get",
      "ids": [
        1,
        2,
        3
      ]
    }
    

    另一个选项是带有主体的GET请求。该请求可能与上面的POST请求类似,但不需要指定操作。您可以在ElasticSearch等项目中看到这种方法。当涉及到具有主体的GET请求时,HTTP规范的定义是模糊的(请参见RFC 7231

    RFC特别指出:

    A payload within a GET request message has no defined semantics; sending a payload body on a GET request might cause some existing implementations to reject the request.

    虽然我不能代表ElasticSearch的开发人员发言,但我认为引用的最后一部分(“某些现有实现[可能]拒绝该请求”)是ElasticSearch同时接受批量请求的GETPOST请求的原因之一

  3. # 3 楼答案

    我认为这正在成为Data-as-a-service下的一个常见用例,在这种情况下,GET操作或POST(CUD)操作都有批量请求。架构的选择将由多个因素决定

    我的回答仅基于数据量因素: 对于较小的卷,单个节点/服务器可以完成给定的请求,但如果您试图“查询”或“更新”数千或数百万条记录,该怎么办。这种情况可能需要将工作负载分配给多个工作节点,因此异步、事件驱动、容器化、消息传递的设置可能更合适

    示例: 您可以向服务器发送一个请求,而服务器又可以将工作负载分配给多个工作人员,然后每个工作人员将响应发布到队列中,原始客户端可以在一段时间后从队列中获取结果