小编And*_*vić的帖子

Spring WebFlux Web 客户端 - 迭代分页 REST API

我需要从可分页 REST API 的所有页面获取项目。我还需要在项目可用时立即开始处理项目,而不需要等待所有页面加载。为此,我使用 Spring WebFlux 及其 WebClient,并希望返回Flux<Item>. 此外,我使用的 REST API 受到速率限制,并且对其的每个响应都包含包含当前限制详细信息的标头:

  • 当前窗口的大小
  • 当前窗口剩余时间
  • 在窗口中请求配额
  • 当前窗口中剩余的请求

对单页请求的响应如下所示:

{
    "data": [],
    "meta": {
      "pagination": {
        "total": 10,
        "current": 1
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

数据数组包含实际项目,而元对象包含分页信息。

我当前的解决方案首先执行“虚拟”请求,只是为了获取总页数和速率限制。

Mono<T> paginated = client.get()
    .uri(uri)
    .exchange()
    .flatMap(response -> {                  
        HttpHeaders headers = response.headers().asHttpHeaders();

        Limits limits = new Limits();
        limits.setWindowSize(headers.getFirst("X-Window-Size"));
        limits.setWindowRemaining(headers.getFirst("X-Window-Remaining"));
        limits.setRequestsQuota(headers.getFirst("X-Requests-Quota");
        limits.setRequestsLeft(headers.getFirst("X-Requests-Remaining");

        return response.bodyToMono(Paginated.class)
                .map(paginated -> { 
                    paginated.setLimits(limits);
                    return paginated;
                });
    });
Run Code Online (Sandbox Code Playgroud)

之后,我发出一个包含页码的 Flux,对于每个页面,我都会执行一个 REST API 请求,每个请求都被延迟足够长,因此不会超过限制,并返回提取的项目的 Flux:

return paginated.flatMapMany(paginated -> {
    return Flux.range(1, paginated.getMeta().getPagination().getTotal()) …
Run Code Online (Sandbox Code Playgroud)

project-reactor spring-webflux

5
推荐指数
1
解决办法
4690
查看次数

标签 统计

project-reactor ×1

spring-webflux ×1