使用 Spring Boot 2 WebClient,以线程安全/per-request 方式,如何发送 diff headers 每个请求?

Using Spring Boot 2 WebClient, in threadsafe / per-request manner, how send diff headers every request?

在 Spring Boot 1.5.x 中,我可以使用带有 AsyncRestTemplate 的拦截器从传入请求中获取 headers 到 RestController 端点,并且将它们放入通过 AsyncRestTemplate.

发出的任何 exchange 请求中

我不明白这如何与 WebClient 一起工作。看起来如果您构建一个 WebClient,它的所有 headers 等都已设置且不可更改:

WebClient client = WebClient.builder()
    .baseUrl( "http://blah.com" )
    .defaultHeader( "Authorization", "Bearer ey..." )
    .build();

虽然我可以使用 client.mutate() 更改这些设置,但它实例化了一个全新的 WebClient object。我不想在每次请求时都创建一个新的。有没有办法保留一个WebClient和有per-requestheaders等参数?

每次都强制创建一个新的 object 似乎是一种很大的浪费和糟糕的性能。

您在此处使用的是默认值 headers,应针对此 WebClient 实例发送的所有请求发送。所以这对于一般用途很有用 headers.

您当然可以在 per-request 的基础上更改请求 headers,如下所示:

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

如果您希望有一种 interceptor-like 机制在发送请求之前改变请求,您可以使用过滤器配置 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