使用Spring Boot 2 WebClient以线程安全/每个请求的方式,如何在每个请求中发送diff头?

时间:2019-02-21 01:02:39

标签: java spring-boot spring-webflux

在Spring Boot 1.5.x中,我可以将拦截器与AsyncRestTemplate一起使用,以将来自传入请求的标头捕获到RestController端点,并将其放在通过{发出的任何exchange请求中{1}}。

我看不到AsyncRestTemplate如何使用。看起来,如果您构建WebClient,其所有标头等都已设置且不可更改:

WebClient

虽然我可以使用WebClient client = WebClient.builder() .baseUrl( "http://blah.com" ) .defaultHeader( "Authorization", "Bearer ey..." ) .build(); 进行更改,但可以实例化一个全新的WebClient对象。我希望不必在每个请求上都创建一个新请求。没有办法保留client.mutate()并具有按请求的标头和其他参数吗?

每次强制创建一个新对象似乎是一大浪费,而且性能很差。

1 个答案:

答案 0 :(得分:1)

这里使用的是应该为此WebClient实例发送的所有请求发送的默认标头。因此,这对于通用标头很有用。

您当然可以像这样按每个请求更改请求标头:

Mono<String> result = this.webClient.get()
      .uri("/greeting")
      .header("Something", "value")
      .retrieve().bodyToMono(String.class);

如果您希望具有类似拦截器的机制来在发送请求之前对其进行更改,则可以使用过滤器配置WebClient实例:

WebClient
    .builder()
    .filter((request, next) -> {
            // you can mutate the request before sending it
            ClientRequest newRequest = ClientRequest.from(request)
                    .header("Something", "value").build();
            return next.exchange(newRequest);
})

请签出the Spring Framework documentation about WebClient