【问题标题】:Spring boot Webclient's retrieve vs exchangeSpring Boot Webclient 的检索与交换
【发布时间】:2019-10-16 09:44:02
【问题描述】:

我最近开始在我的 Spring boot 项目中使用WebClient。 有人可以阐明WebClientexchangeretrieve 方法之间的差异/用法吗?

我知道exchange 返回Mono<ClientResponse>retrieve 返回ResponseSpec,我只是想知道何时/为什么应该使用它们中的每一个。

非常感谢。

【问题讨论】:

    标签: spring-boot reactive-programming spring-webclient


    【解决方案1】:

    根据spring Webclient api documentation,两者的区别在于exchangeretrieve除了body之外的其他http响应信息,比如headers和status,而retrieve只返回body信息。

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

    【讨论】:

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

    添加到 @JArgente 的 答案中。

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

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

    ...

    此方法是使用 exchange() 并通过以下方式解码响应正文的快捷方式 客户响应。

    exchange() 方法

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


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

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

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

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


    更新 1

    Spring 5.3 开始,exchange() 方法已弃用,因为可能存在内存/连接 strong> 泄漏。可以改用exchangeToMono()exchangeToFlux()

    感谢 @rhubarb 的更新。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2019-05-17
    • 2021-04-05
    • 2018-02-09
    • 2021-10-13
    • 2020-08-18
    相关资源
    最近更新 更多