Spring Boot Sping Boot Webclient的retrieve vs exchange

aoyhnmkz  于 2023-04-20  发布在  Spring
关注(0)|答案(3)|浏览(264)

我最近在我的***Sping Boot ***项目中开始使用WebClient。有人能说说WebClientexchangeretrieve方法之间的区别/用法吗?
我知道exchange返回Mono<ClientResponse>retrieve返回ResponseSpec,我只是想知道何时/为什么我应该使用它们中的每一个。

q3qa4bjr

q3qa4bjr1#

添加到 *@Jargente的 * 答案。
根据retrieve()方法的官方文档:
执行HTTP请求,获取响应体
...
此方法是使用exchange()并通过ClientResponse解码响应体的快捷方式。
exchange()方法
执行HTTP请求,返回一个ClientResponse,包含响应状态和头部,然后您可以使用响应的方法来消费主体:
retrieve()方法对ClientResponse对象进行解码,并将现成的对象交给您使用。它没有一个非常好的处理异常的api。
然而,另一方面,exchange()方法将ClientResponse对象本身沿着响应状态和头部一起交给您。使用exchange方法,您可以对响应对象进行细粒度控制,并且可以更好地处理响应对象和异常。

如果你只是想使用一些API请使用retrieve()
***如果你想更好地控制你的响应对象,头和异常,请使用exchange()
更新1

Spring 5.3开始,exchange()方法***弃用***,原因是可能存在***内存/连接***泄漏,可以使用exchangeToMono()exchangeToFlux()
谢谢@ rubbish的更新。

bfnvny8b

bfnvny8b2#

根据spring Webclient API文档,两者之间的区别在于,exchange除了body之外还检索其他http响应信息,如header和status,而retrieve只返回body信息。
所以如果你只需要body信息,你应该使用retrieve,因为这是交换的捷径,然后获取body,但如果你需要其他信息,如http状态,你必须使用exchange。

uplii1fm

uplii1fm3#

我认为当你只需要API的主体时,使用retrieve()更合适,也更实用,因为它处理的是4xx和5xx范围的状态。

相关问题