我刚刚升级到 Webflux 5.3.0,并注意到 WebClient.exchange() 方法现在已被弃用(链接)以支持新方法 .exchangeToMono() 和 .exchangeToFlux()
我有这个代码:
webClient
.method(request.method)
.uri(request.path)
.body(request.bodyToMono<ByteArray>())
.exchange()
.flatMap { response ->
ServerResponse.
.status(response.statusCode())
.headers { it.addAll(response.headers().asHttpHeaders()) }
.body(response.bodyToMono<ByteArray>())
}
Run Code Online (Sandbox Code Playgroud)
我不得不将其重构为:
.exchangeToMono { response ->
ServerResponse.
.status(response.statusCode())
.headers { it.addAll(response.headers().asHttpHeaders()) }
.body(response.bodyToMono<ByteArray>())
}
Run Code Online (Sandbox Code Playgroud)
然而,显然 .exchangeToMono() 调用了 .releaseIfNotConsumed(),它释放了未处理的响应体,并且基本上使服务器返回一个空体
所以我不得不进一步重构我的代码:
.exchangeToMono { response ->
response.bodyToMono<ByteArray>()
.defaultIfEmpty(ByteArray(0))
.flatMap { body ->
ServerResponse.
.status(response.statusCode())
.headers { it.addAll(response.headers().asHttpHeaders()) }
.bodyValue(body)
}
}
Run Code Online (Sandbox Code Playgroud)
据我了解, .exchange() 允许我的代理服务器传输响应正文而不实际处理它,而 .exchangeToMono() 强制我处理(缓冲?)它。这样对吗?
如果是这样,有什么影响?我应该接受更改,还是应该以某种方式调整代码以使其传输响应主体而不处理它?我该怎么做?
==========
tl;dr通过.body(response.bodyToMono())和之间的实际区别是什么.bodyValue(body)?