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

标签 java spring-boot spring-webflux

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

请查看the Spring Framework documentation about WebClient .

关于java - 使用 Spring Boot 2 WebClient,以线程安全/每个请求的方式,如何在每个请求发送 diff header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54797658/

相关文章:

java - 使用 WebLogic 获取当前 EAR 路径

java - 如何为 2 组单选按钮添加 Action 列表

java - Android 谷歌地图授权失败

java - 如何运行gulp任务和spring-boot :run together with maven?

java - 删除 ArrayList 中的所有空格。 java

java - 如何使用Spring Boot对WebFlux进行异常处理?

java - 应用程序无法使用 @Async 注释启动

spring-boot - 如何在 spring-webflux RouterFunction 端点中使用 OpenApi 注释?

java - 在Spring webflux Flux响应中将一个响应对象转换为另一个对象(pojo)而不订阅它

spring-security - 如何使用带有 WebClient 的 spring-security-oauth2 自定义 OAuth2 token 请求的 Authorization header ?