Spring 启动 Webclient 的检索与交换

Spring boot Webclient's retrieve vs exchange

我最近开始在我的 Spring boot 项目中使用 WebClient。 有人可以对 WebClient.

exchangeretrieve 方法之间的 differences/usages 有所了解吗?

我明白exchangereturnsMono<ClientResponse>retrievereturnsResponseSpec,我只想知道when/why我应该使用它们中的每一个。

非常感谢。

根据spring Webclient api documentation,两者之间的区别在于,exchange 除了获取 body 之外,还获取其他 http 响应信息,例如 headers 和 status,而仅获取 returns body 信息。

所以如果你只需要body信息你应该使用retrieve,因为它是交换然后获取body的快捷方式,但是如果你需要其他信息比如http状态你必须使用exchange。

添加到 @JArgente 的 回答。

根据retrieve()方法的官方文档:

Perform the HTTP request and retrieve the response body.

...

This method is a shortcut to using exchange() and decoding the response body through ClientResponse.

exchange()方法

Perform the HTTP request and return a ClientResponse with the response status and headers. You can then use methods of the response to consume the body:


retrieve() 方法解码 ClientResponse object 并交给您 ready-made object 供您使用。它没有很好的 api 来处理异常。

然而,另一方面,exchange() 方法会向您提供 ClientResponse object 本身以及响应状态和 headers。使用交换方法,您可以获得对响应 object 的细粒度控制以及处理响应 object 和异常的更好方法。

如果你只想消费一些 api 就去 retrieve().

如果您想更好地控制您的响应 object、headers 和例外情况,请使用 exchange().


更新 1

Spring5.3开始,可以使用exchange() method is deprecated due to possible memory/connection leaks. exchangeToMono() or exchangeToFlux()代替

感谢 @rhubarb 的更新。