我需要从可分页 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)