在 Spring Boot 1.5.x 中,我可以使用带有 AsyncRestTemplate
的拦截器从传入请求中获取 header 到 RestController
端点,并将它们放入任何 exchange 中
通过 AsyncRestTemplate
发出的请求。
我不明白这如何与 WebClient
一起使用。看起来如果您构建一个 WebClient
,它的所有 header 等都已设置且不可更改:
WebClient client = WebClient.builder()
.baseUrl( "http://blah.com" )
.defaultHeader( "Authorization", "Bearer ey..." )
.build();
虽然我可以使用 client.mutate()
更改这些内容,但它会实例化一个全新的 WebClient 对象。我不想为每个请求创建一个新的。是否没有办法保留 WebClient
并拥有每个请求的 header 和其他参数?
每次都强制创建一个新对象,这似乎是一种很大的浪费,而且性能很差。
最佳答案
您在此处使用的是应为此 WebClient
实例发送的所有请求发送的默认 header 。因此这对于通用 header 很有用。
您当然可以在每个请求的基础上更改请求 header ,如下所示:
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);
})
关于java - 使用 Spring Boot 2 WebClient,以线程安全/每个请求的方式,如何在每个请求发送 diff header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54797658/