当前位置: 首页 > 知识库问答 >
问题:

SpringBoot WebFlux:解析并行WebClient请求

屠晟睿
2023-03-14

我正在用spring WebClient对API进行并行rest调用。响应如下所示

{
  "d": {
    "results": [
        {
            "id": "1",
            "name": "Test A"
        },
        {
            "id": "2",
            "name": "Test B",
        }

    ]
  }
}

POJOS:

public class ProductResponse {
    private Products d;
}

public class Products {
    private List<ProductModel> results;
}

public class Product {
    private String id;
    private String name;
}
public Flux<ProductsResponse> getProducts(final List<String> pages) {
    return Flux.fromIterable(pages)
            .flatMap(page -> webClient.get().uri("SOMEURL?page={page}", page)
                    .accept(MediaType.APPLICATION_JSON)                        
                    .retrieve()
                    .bodyToMono(ProductsResponse.class))
            .log()
            .subscribeOn(Schedulers.elastic());
}

获取产品

Flux<ProductsResponse> productList = getProductList(pages);
List<ProductsResponse> productsResponse = productList.collectList().block();
for (ProductsResponse response : productsResponse) {
    for (ProductModel product: response.getD().getResults()) {
        System.out.println(product.getProductId());
    }
}

这也是有效的,但是有没有一种方法可以直接返回flux ,或者返回mono 更好?

(下一步是将产品保存在数据库中)

共有1个答案

罗源
2023-03-14

请按以下方式尝试:

        Flux<Product> productFlux = Flux.fromIterable(pages)
            .flatMap(page -> client.get().uri("SOMEURL?page={page}", page)
                    .accept(MediaType.APPLICATION_JSON)
                    .retrieve()
                    .bodyToMono(ProductResponse.class)
                    .map(productResponse -> productResponse.d.results)
                    .flatMapMany(Flux::fromIterable))
            .log()
            .subscribeOn(Schedulers.elastic());
 类似资料:
  • 我试图使用新的SpringBoot2 Reactive WebClient类(它没有批处理endpoint)对同一个rest服务进行并行(批处理)调用。例如,我需要100个“comment”对象(ids为1...100),我正在执行以下并行调用: 我是Spring WebFlux的新手,我不确定这是否是用WebClient进行并行调用的正确方法 > 有没有更好(更合适)的方法来做这件事(即做一个单

  • 问题内容: 我正在编写一个处理具有深节点结构的xml文件(> 1000)的应用程序。使用woodstox(事件API)大约需要6秒钟来解析具有22.000个节点的文件。 该算法被置于与用户交互的过程中,其中只有几秒钟的响应时间是可以接受的。因此,我需要改进如何处理xml文件的策略。 我的过程分析xml文件(仅提取几个节点)。 处理提取的节点,并将新结果写入新的数据流(产生具有修改后的节点的文档副本

  • 我正在从Go中的YAML输入创建一个文档生成器。它需要指定每个项目/节点是从YAML文件的哪一行生成的。有没有办法在Go中实现? 例如,这是一个YAML文件 我希望看到以下内容 我看到一个类似的问题回答了Python解析YAML,返回行号,但我不知道如何利用https://pkg.go.dev/gopkg.in/yaml.v3

  • 是否可以在webclient上将多个请求链接在一起?例如,我希望在进行交易时能够更新买方和卖方的余额。现在它只更新买家余额: 是否有一种方法可以将两个put方法调用在一起,以便更新两个余额? 更新:此方法适用于将单声道值作为uri变量调用。

  • Spring留档声明,即使要执行同步超文本传输协议调用,我们也必须从RestTemboard切换到。 目前,我有以下代码: 当然,我可以在这里使用CountdownLatch,但它看起来像是API滥用。 如何执行同步请求?

  • 我希望有人能帮我解决这个问题。 我想用WebClient创建一个Rest客户端,从API中检索响应。所以我创建了我的Spring项目,添加了webflux、lombok和h2。我还创建了一个DTO类“CashAccount”和以下方法: 当我使用“.bodyToMono(String.class)”时,所有的功能都很好,我收到了结果: 相反,当我使用“.bodyToMono(cashcount.c