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

jlp*_*jlp 2 java spring-webflux spring-webclient

我是 Spring WebClient 的新手。我有以下方法使用 WebClient 调用端点,并且我需要从此方法返回 ResponseEntity。我知道我可以 call 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

}
Run Code Online (Sandbox Code Playgroud)

Tho*_*olf 5

如果你想退货ResponseEntity没有其他办法,你需要block

这样想,你发出一个请求,你需要等待响应,直到我们可以构造一个,ResponseEntity因为我们需要返回的数据,直到我们可以构造它。

如果您正在编写一个完全非阻塞的应用程序,那么这很糟糕,因为在所有事情中间您基本上都在大喊“停止”,并且整个应用程序会冻结,直到获得响应然后继续。

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

然后你可以提取、转换、使用诸如map、flatMap、zip等函数,但只要你总是返回a,因为Mono记住,我们没有值,我们基本上只是构建一个我们想要的管道当我们真正具有价值时我们的应用程序就要做。

我建议您阅读Reactor 文档来了解反应式编程解决的问题,然后如何开始使用它,因为在堆栈溢出的简单答案中无法解释太多内容。