【问题标题】:calling 2 url with web client spring boot with in sequential order使用 web 客户端 spring boot 按顺序调用 2 url
【发布时间】:2021-10-22 23:45:34
【问题描述】:

这个问题与 webflux spring boot 相关。我有 2 个 Web 客户端,一个调用 url 以获取帐户,然后我将这些帐户发送到对象映射器以映射到 POJO。然后我使用第二个 Web 客户端使用这些帐户调用第二个 url。谁能告诉我如何让它们按顺序执行?

在当前情况下,当我从第一个 Web 客户端收到响应并将响应发送到对象映射器时,第二个 Web 客户端启动并且请求正文中的帐户变为 null。

我们将不胜感激。

谢谢。

【问题讨论】:

    标签: java spring spring-boot spring-webflux


    【解决方案1】:

    默认情况下,webclient 是非阻塞 I/O。考虑到您正在使用 ObjectMapper 转换第一次调用的响应。您可以使用 block() 方法使其阻塞调用。

    Example:
    webClient.get().uri("http:/sdfsdf.com/sdsd").retrieve().bodyToMono(String.class).block();
    

    【讨论】:

    • 我尝试使用 .block() 但出现异常(无法使用 .block())所以不得不删除它
    • 你能告诉我你收到的异常是什么吗?
    • reactive系统不建议调用block操作。
    • block()/blockFirst()/blockLast() 是阻塞的,线程 reactor-http-nio-4 不支持
    【解决方案2】:

    WebClient 输出转换为Mono<YouPojo> 并使用flatMap 调用您想要的下一个服务。

        WebClient client1 = null;
        WebClient client2 = null;
    
        Mono<String> finalResult = client1.get()
                .uri("https://example.com/service-1")
                .retrieve()
                .bodyToMono(String.class)
                .flatMap(result -> client2.post()
                        .uri("https://example.com/service-2")
                        .body(BodyInserters.fromFormData("result", result))
                        .retrieve()
                        .bodyToMono(String.class));
    

    正如您在上面看到的,我们有两个客户端client1client2,我们使用它们来调用相应的服务。您可以将Monos 的结果与mapflatMap 操作结合起来。

    【讨论】:

    • 谢谢,所以我有另一个文件,它获取从第一次通话中检索到的帐户,并在请求正文中使用它进行第二次通话。根据您的解决方案,BodyInserters 会发生什么?因为请求正文必须与第二个 Web 客户端后调用的格式相匹配。第一次调用的帐户将只是请求正文中更大 POJO 的一部分。
    • 是的,也许它可以解决您的问题。我使用BodyInserters#fromFormData 将结果传递给client2
    • 所以我认为在 faltMap 中使用 { } 我可以有类似的东西: Pojo.setAccounts(request.getAccounts) 然后在 requestbody 中发送那个特定的 pojo。谢谢。
    • 是的,您可以为所欲为,然后订阅最新的Mono 以按顺序运行流程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 2022-11-28
    • 2019-01-29
    • 2021-09-26
    相关资源
    最近更新 更多