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 中设置超时