【问题标题】:How to process comma separated string of ids using Mono<String>如何使用 Mono<String> 处理逗号分隔的 id 字符串
【发布时间】:2021-09-09 21:33:42
【问题描述】:

我有一个 api,它给了我一个逗号分隔的 id 列表,我正在使用 Spring Boot WebClient 来调用它并处理响应。

API 响应是纯文本/文本(不是 json)的 [1,2,3,4],我正在执行以下操作来处理结果 -

Mono<String> ids = client.get()
                .uri("http://localhost:8080")
                .retrieve()
                .bodyToMono(String.class);

我想知道如何从那里处理 ids 变量中的项目。

这个 api 的新手。

【问题讨论】:

    标签: spring-boot spring-webflux flux reactor


    【解决方案1】:

    您可以将响应直接转换为Flux,并逐项处理

    webClient.get()
            .uri("http://localhost:8080")
            .retrieve()
            .bodyToFlux(Integer.class)
            .doOnNext(id -> {
                System.out.println(id);
                // process id...
            })
            .subscribe();
    

    另一种可能的选择是使用方法flatMapIterableMono&lt;String&gt; 转换为Flux&lt;Integer&gt;

    ids.flatMapIterable(line -> Arrays.asList(line.replace("[", "").replace ("]", "").split(",")))
            .doOnNext(id -> System.out.println(id))
            .subscribe();
    

    【讨论】:

    • 第一次失败,错误不能转换为整数,因为内容类型是纯文本/文本。我尝试将它转换为 String.class 但它仍然将它作为一个完整的字符串输出,而不是一一作为它的纯文本/文本。第二个是语法错误
    • The 2nd is giving syntax error - 哪一部分有语法错误?你加了import java.util.Arrays;吗?
    • 谢谢。那行得通。我的错。还有一个后续问题 - 在 doOnNext() 内部,我对 2 个单独的 API 进行了 2 次调用,并获得 2 个 Mono 然后我将其压缩到一个最终的 Mono 中。现在有没有办法让我将这个最终的 Mono 作为 Mono 返回
    • 类似于:Mono&lt;String&gt; yourFinalMono = ...; yourFinalMono.flatMap(line -&gt; ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(line, String.class));
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多