如何使用Spring5 WebClient进行异步调用

时间:2019-11-20 15:29:46

标签: java spring spring-webflux

我是Spring Reactive框架的新手,正在尝试使用Spring5 WebClient进行异步调用。 我能够成功完成与同步相同的呼叫。但是面临异步调用的问题。

我正在使用以下代码进行异步调用:

Mono<ClientResponse> reponse = WebClient.builder().build().post()
.uri("http://api.com")
.body(BodyInserters.fromObject("data"))
.accept(MediaType.APPLICATION_JSON)
.header("Authorization", "Bearer blahblahblahblah")
.exchange();

// couple of logger messages and other statements

问题在于它没有执行API调用并且没有给出响应。它正在继续执行其他语句,但从不调用API调用。

我不想使用block()方法,因为它将转换为同步调用。

我已经搜索了很多网站和文档,但是同一代码用于异步调用。但是不确定为什么它不起作用。如果我想念什么,谁能帮我?

2 个答案:

答案 0 :(得分:0)

您需要订阅结果。可以使用block() call

  

订阅此Mono并无限期阻止,直到接收到下一个信号。返回该值;如果Mono完成为空,则返回null。如果发生Mono错误,则会引发原始异常(如果它是检查的异常,则包装在RuntimeException中)。

没有订阅,该呼叫不是设计执行的。但是,您可以在其他流中传递准备好的单声道以将它们合并,但是要获得结果,您必须在某个地方调用终止操作。

答案 1 :(得分:0)

下面的代码可以工作。

Mono<ClientResponse> reponse =
WebClient.builder().build().post()
.uri("http://api.com")
.body(BodyInserters.fromObject("data"))
.accept(MediaType.APPLICATION_JSON)
.header("Authorization", "Bearer blahblahblahblah")
.bodyToMono(ClientResponse.class)
.retrieve();