Spring WebFlux WebClient 构建器设置请求正文

Posted

技术标签:

【中文标题】Spring WebFlux WebClient 构建器设置请求正文【英文标题】:Spring WebFlux WebClient builder set request body 【发布时间】:2020-07-12 11:08:45 【问题描述】:

在WebClient.Builder的情况下,我们如何设置请求体?这是我的代码-

WebClient.Builder webClientBuilder = WebClient.builder().baseUrl(clientMetadataServiceUri).defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).filters(exchangeFilterFunctions -> 
        exchangeFilterFunctions.add(logRequest());
        exchangeFilterFunctions.add(logResponse());
    );

webClientBuilder.clientConnector(getHttpConnector()).build().get().exchange().doOnSuccess(clientResponse -> ...)

我应该在哪里以及如何在此处添加请求正文?

【问题讨论】:

【参考方案1】:

我相信这是不可能的。

一般来说,WebClient(或RestTemplate)就像一个模板,你可以用它来调用其他的 Rest Service。你定义这个模板一次,所有需要的自定义,如拦截器、消息转换器、错误处理程序等,你需要与这个特定的服务通信。

现在是对服务的个人调用,对服务的每次调用可能会有所不同。例如,您可能正在调用不同的方法,如 Get、Post.. 等。您可能会调用不同的端点。你可以打电话有/没有身体。由于您始终使用相同的客户端(WebClient/RestTemplate)与该服务进行通信,因此您无法使用特定于单个调用的主体或方法或 url(您只能设置 baseUrl)创建 WebClient 实例。

这类似于 RestTemplateBuilder。您找不到任何方法来设置端点或方法或正文。

您可以为每个调用创建一个单独的 webclient 实例。但这不是通常使用或建议的方式(通常您定义一个 WebClient 类型的 bean 并自动装配它)。因此它不可用。

【讨论】:

【参考方案2】:

问题在于 get() 和许多其他框架一样,Spring WebFlux 也不支持 get 调用的请求正文。在 post 的情况下,它是这样的 -

    WebClient.Builder webClientBuilder = WebClient.builder().baseUrl(clientMetadataServiceUri).defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).filters(exchangeFilterFunctions -> 
        exchangeFilterFunctions.add(logRequest());
        exchangeFilterFunctions.add(logResponse());
    );

webClientBuilder.clientConnector(getHttpConnector()).build().post().body(...).exchange().doOnSuccess(clientResponse -> ...)

【讨论】:

这是不同的东西。只要您致电build。你正在处理WebClient 而不是WebClient.Builder

以上是关于Spring WebFlux WebClient 构建器设置请求正文的主要内容,如果未能解决你的问题,请参考以下文章

Spring WebFlux WebClient 弹性和性能

Spring 5 webflux如何在Webclient上设置超时

在 Spring WebFlux webclient 中设置超时

Spring Webflux WebClient

如何模拟 Spring WebFlux WebClient?

如何在 Spring 5 WebFlux WebClient 中设置超时