如何以非阻塞方式从 WebClient bodyToMono 或 toEntity 获取对象

How to get object from WebClient bodyToMono or toEntity in a Non-Blocking way

我是 Spring WebClient 的新手。我有以下使用 WebClient 调用端点的方法,我需要从该方法 return ResponseEntity。我知道我可以调用 block(),但无论如何我可以以非阻塞方式进行调用吗?即使我可以 return Mono,调用方法仍然需要解包并获取 ResponseEntity,调用方法如何做,调用 block?

public ResponseEntity getData() {

    Mono<ResponseEntity<String>> entityMono = webClient.post()
                                                       .uri(url)
                                                       .body(BodyInserters.fromValue(aString))
                                                       .retrieve()
                                                       .toEntity(String.class);

     // what do I need to do here so that I can return ResponseEntity non-blocking

}

如果你想return一个ResponseEntity没有别的办法,你需要block.

这样想,你做了一个请求,你需要等待响应,直到我们可以构建一个 ResponseEntity 因为我们需要 returned 数据,直到我们可以构建它。

如果您正在编写一个完整的 non-blocking 应用程序,这很糟糕,因为在所有内容的中间您基本上都在大喊停止,并且整个应用程序会冻结,直到它获得响应然后继续。

另一种选择是 return Mono<ResponseEntity> 这更像是一个承诺。你基本上是在说“当我得到答案时,我会保证会有一个 ResponseEntity,我只是不知道什么时候所以你现在必须使用 Mono`

然后你可以提取、转换,使用像 map、flatMap、zip 等函数,但只要你总是 return a Mono 因为记住,我们没有的价值,我们基本上只是建立一个管道,当我们真正拥有这个价值时,我们希望我们的应用程序做什么。

我建议您通过 Reactor Documentation 了解响应式编程解决的问题,然后如何开始使用它,因为在堆栈溢出的简单答案中解释太多了。