spring - 如何使用 Spring Boot WebClient 收集分页 API 响应?

标签 spring spring-boot reactive-programming spring-webflux project-reactor

我有一个来自 URL 的分页响应,我想继续点击从上一个响应中获得的下一页 URL,并继续收集项目,直到我的响应中没有“nextPage”URL。如何使用来自 WebFlux 的 Spring Boot WebClient 以无阻塞的 react 方式实现这一点?

Request1: 

    GET /items
    response: 
    {
        items: [...]
        nextPage: "/items?page=2"
    }


    Request2: 

    GET /items?page=2
    response: 
    {
        items: [...]
        nextPage: "/items?page=3"
    }


    Request3: 

    GET /items?page=3
    response: 
    {
        items: [...]
        nextPage: null
    }

在这里,我创建了模拟网址
https://karthikdivi.com/apps/paginatedReviews/withNextPageTokens/items
https://karthikdivi.com/apps/paginatedReviews/withNextPageTokens/items?page=2
https://karthikdivi.com/apps/paginatedReviews/withNextPageTokens/items?page=3

如何以无阻塞的 react 方式从上述响应中提取所有项目?

最佳答案

使用expand,这可以实现。
基于您提供的模拟网址。

public Mono<List<Item>> getItems() {
    String url = "https://karthikdivi.com/apps/paginatedReviews/withNextPageTokens/items";

    return fetchItems(url).expand(response -> {
        if (response.getNextPage() == null) {
            return Mono.empty();
        }
        return fetchItems(response.getNextPage());
    }).flatMap(response -> Flux.fromIterable(response.getItems())).collectList();
}

private Mono<Response> fetchItems(String url) {

         return client.get().uri(url).retrieve()
                    .bodyToMono(Response.class);
    }

关于spring - 如何使用 Spring Boot WebClient 收集分页 API 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53274568/

相关文章:

java - 如何在 Spring JDBC 中获取当前的 Connection 对象

jdbc - 如何在 SimpleJdbcTemplate 上设置QueryTimeout?

java - 配置 Springboot 以使用 2 个不同的数据库

java - 添加 Spring Security 后 WebMVC 测试失败,如何一次性修复?

java - 名称 "context:annotation-config"对于 JDOM/XML 不合法

java - spring boot中如何访问非主DataSource?

javascript - 如何使用 react 事件流同时处理鼠标和触摸事件

java - 如何在 RxJava Vert.x 中结束链式 http 请求?

java - 如何将阻塞代码变成响应式代码?

java - 无法在 Spring 3.2.8 和 junit 4.4 中 Autowiring 现场执行 Junit 测试