同步使用
WebClient
可以通过在末尾阻塞来以同步样式使用结果:
-
Java
-
Kotlin
Person person = client.get().uri("/person/{id}", i).retrieve()
.bodyToMono(Person.class)
.block();
List<Person> persons = client.get().uri("/persons").retrieve()
.bodyToFlux(Person.class)
.collectList()
.block();
val person = runBlocking {
client.get().uri("/person/{id}", i).retrieve()
.awaitBody<Person>()
}
val persons = runBlocking {
client.get().uri("/persons").retrieve()
.bodyToFlow<Person>()
.toList()
}
但是,如果需要进行多个调用,则避免在每个调用上阻塞会更有效 response 中,而是等待组合的结果:
-
Java
-
Kotlin
Mono<Person> personMono = client.get().uri("/person/{id}", personId)
.retrieve().bodyToMono(Person.class);
Mono<List<Hobby>> hobbiesMono = client.get().uri("/person/{id}/hobbies", personId)
.retrieve().bodyToFlux(Hobby.class).collectList();
Map<String, Object> data = Mono.zip(personMono, hobbiesMono, (person, hobbies) -> {
Map<String, String> map = new LinkedHashMap<>();
map.put("person", person);
map.put("hobbies", hobbies);
return map;
})
.block();
val data = runBlocking {
val personDeferred = async {
client.get().uri("/person/{id}", personId)
.retrieve().awaitBody<Person>()
}
val hobbiesDeferred = async {
client.get().uri("/person/{id}/hobbies", personId)
.retrieve().bodyToFlow<Hobby>().toList()
}
mapOf("person" to personDeferred.await(), "hobbies" to hobbiesDeferred.await())
}
以上只是一个例子。还有许多其他 pattern 和运算符可用于放置 一起进行许多远程调用(可能是一些嵌套的 相互依存,直到最后都没有阻塞。
使用 或 ,你永远不必在 Spring MVC 或 Spring WebFlux 控制器中阻塞。
只需从 controller 方法返回结果响应式类型。同样的原则也适用于
Kotlin 协程和 Spring WebFlux 中,只需在
controller 方法 。 |