使用 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);
})
在 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);
})