相关疑难解决方法(0)

Spring WebFlux 5.3.0 - WebClient.exchangeToMono()

我刚刚升级到 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)

spring-webflux spring-webclient

7
推荐指数
1
解决办法
9329
查看次数

标签 统计

spring-webclient ×1

spring-webflux ×1