我正在尝试实现流代理。我从 spring 反应中遇到了 WebClient 的问题。
任何人都可以帮助我理解我是不是有些错误的方式,或者这只是 WebClient 方面的错误?
堆:
反应堆-netty 0.7.8.RELEASE
spring-boot 2.0.4.RELEASE
描述:
我想将一个长流代理到外部服务,然后将响应流转发给请求者。使用块(HTTP 1.1 Transfer-Encoding : chunked)进行流式传输。外部服务处理每个块并发送到响应结果。
预期行为:
WebClient 应该立即读取每个收到的响应部分。
实际行为:
WebClient 在请求写入完成之前不会开始处理响应。
代码:
return client
.post()
.header("Transfer-Encoding", "chunked")
//because I want to flush each received part
.body((outputMessage, context) -> outputMessage.writeAndFlushWith(
request.body(BodyExtractors.toDataBuffers())
.map(dataBuffer -> Mono.just(dataBuffer))))
.exchange()
.flatMap(clientResponse -> {
ServerResponse.BodyBuilder bodyBuilder = ServerResponse.status(clientResponse.statusCode());
bodyBuilder.contentType(MediaType.APPLICATION_STREAM_JSON);
return bodyBuilder.body((outputMessage, context) ->
outputMessage.writeAndFlushWith(
clientResponse.body(BodyExtractors.toDataBuffers())
.map(dataBuffer -> Mono.just(dataBuffer))
));}
);