我开始从Spring-boot学习Webflux。我了解到,对于 RestController 的端点,您可以定义一个 Flux 请求主体,其中我期望一个真正的通量流,即整个请求的各个部分一个接一个地出现,并且这些部分也可以一个接一个地处理。然而,在使用客户端和服务器构建了一个小示例之后,我无法让它按预期工作。
这是服务器的片段:
@PostMapping("/digest")
public Flux<String> digest(@RequestBody Flux<String> text) {
continuousMD5.reset();
return text.log("server.request.").map(piece -> continuousMD5.update(piece)).log("server.response.");
}
Run Code Online (Sandbox Code Playgroud)
注意:每一段文本都会被发送到一个 ContinuousMD5 对象,该对象会累加所有的段,并计算并返回每次累加后的中间 MD5 哈希值。MD5 计算之前和之后都会记录流。
这是客户端的片段:
@PostConstruct
private void init() {
webClient = webClientBuilder.baseUrl(reactiveServerUrl).build();
}
@PostMapping(value = "/send", consumes = MediaType.TEXT_PLAIN_VALUE)
public Flux<String> send(@RequestBody Flux<String> text) {
return webClient.post()
.uri("/digest")
.accept(MediaType.TEXT_PLAIN)
.body(text.log("client.request."), String.class)
.retrieve().bodyToFlux(String.class).log("client.response.");
}
Run Code Online (Sandbox Code Playgroud)
注意:客户端接受一些文本的通量流并记录该流并将其发送到服务器(作为通量流)。
令人惊讶的是,我可以通过以下命令行发送 REST 请求并让客户端接收通量流:
@PostConstruct
private void init() {
webClient = webClientBuilder.baseUrl(reactiveServerUrl).build();
}
@PostMapping(value = "/send", consumes = MediaType.TEXT_PLAIN_VALUE)
public Flux<String> send(@RequestBody Flux<String> text) { …Run Code Online (Sandbox Code Playgroud)