Spring boot Spring boot Webclient';s检索vs交换

Spring boot Spring boot Webclient';s检索vs交换,spring-boot,reactive-programming,spring-webclient,Spring Boot,Reactive Programming,Spring Webclient,我最近开始在我的Spring boot项目中使用WebClient。 有人能解释一下WebClient中exchange和retrieve方法之间的区别/用法吗 我理解exchange返回Mono和retrieve返回ResponseSpec,我只想知道我应该何时/为什么使用它们 非常感谢。根据两者的区别,exchange除了检索正文外,还检索其他http响应信息,如标题和状态,而retrieve只返回正文信息 因此,如果您只需要正文信息,您应该使用retrieve,因为它是exchange然后

我最近开始在我的Spring boot项目中使用
WebClient
。 有人能解释一下
WebClient
exchange
retrieve
方法之间的区别/用法吗

我理解
exchange
返回
Mono
retrieve
返回
ResponseSpec
,我只想知道我应该何时/为什么使用它们

非常感谢。

根据两者的区别,exchange除了检索正文外,还检索其他http响应信息,如标题和状态,而retrieve只返回正文信息

因此,如果您只需要正文信息,您应该使用retrieve,因为它是exchange然后获取正文的快捷方式,但如果您需要其他信息,如http状态,则必须使用exchange。

添加到@JArgente的答案中

根据该方法的官方文件:

执行HTTP请求并检索响应正文

此方法是使用exchange()并通过 ClientResponse

方法呢

执行HTTP请求并返回带有响应状态和标题的ClientResponse。然后,您可以使用响应方法来消耗身体:


retrieve()
方法对
ClientResponse
对象进行解码,并将现成的对象交给您使用。它没有很好的api来处理异常

但是,另一方面,
exchange()
方法将ClientResponse对象本身连同响应状态和头一起交给您。使用exchange方法,您可以对响应对象进行细粒度的控制,并可以更好地处理响应对象和异常

如果您只想使用一些api,请使用
retrieve()


如果您想更好地控制响应对象、标题和异常,请使用
exchange()

文档中的重要说明,如果有人忽略了说明:与retrieve()不同,使用exchange()时,应用程序有责任使用任何响应内容,而不管场景如何(成功、错误、意外数据等)。不这样做可能会导致内存泄漏。有关使用正文的所有可用选项的列表,请参阅ClientResponse。通常更喜欢使用retrieve(),除非您有充分的理由使用exchange()它允许在决定如何或是否使用响应之前检查响应状态和标题。@RRR_J所以基本上,如果我们使用exchange(),我们需要编写代码来处理成功、错误和任何特定于应用程序的数据验证?还有其他吗?