WebClient - 添加 defaultHeaders

Posted

技术标签:

【中文标题】WebClient - 添加 defaultHeaders【英文标题】:WebClient - adding defaultHeaders 【发布时间】:2020-11-18 00:26:00 【问题描述】:

我正在尝试将多个标头放入 defaultHeaders(),但我不知道如何从 createHeaders() 方法的返回创建 Consumer 对象

this.someWebClient = WebClient.builder()
        .baseUrl(someConfiguration.getApiUrl())
        .clientConnector(buildTimeoutConnector())
        .defaultHeaders(????) // Consumer<HttpHeaders>
        .build();

我可以用这种方式构建我的标题:

private HttpHeaders createHeaders(String token) 
    HttpHeaders headers = new HttpHeaders();
    headers.add(HttpHeaders.ACCEPT, V1_PUBLIC);
    headers.add(HttpHeaders.HOST, "abc");
    headers.add(HttpHeaders.AUTHORIZATION, "Bearer " + token);
    return headers;

但是如何将其包装到 Consumer 中?

【问题讨论】:

【参考方案1】:

使用这个。

    @Bean
    public WebClient webClientConfiguration() 
        return WebClient
                .builder()
                .clientConnector(new ReactorClientHttpConnector(HttpClient.create()
                        .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, connectionTimeout)
                        .responseTimeout(Duration.ofMillis(responseTimeout))
                ))
                .baseUrl(this.msConfigProperties.getApiUrl())
                .defaultHeaders(httpHeaders())
                .build();
    

然后是消费者函数

    private Consumer<HttpHeaders> httpHeaders()
        return headers -> 
            headers.set(HEADER_CONTENT_TYPE, String.valueOf(MediaType.APPLICATION_JSON));
            headers.setBasicAuth(this.msConfigProperties.getUserName(),this.msConfigProperties.getPassword());
            headers.set(HEADER_ACCEPT_ENCODING, String.valueOf(MediaType.APPLICATION_JSON));
        ;
    

【讨论】:

【参考方案2】:

很明显,方法文档说它需要某种类型的Consumer。因此,您可以创建一个实现Consumer 接口的匿名类像这样使用 lambda 表达式

    使用匿名内部类:
this.someWebClient = WebClient.builder()
        .baseUrl(someConfiguration.getApiUrl())
        .clientConnector(buildTimeoutConnector())
        .defaultHeaders(new Consumer<HttpHeaders>() 
          @Override
          public void accept(HttpHeaders httpHeaders) 
            httpHeaders.addAll(createHeaders(token));
          
        )
        .build();
    使用 lambda:
this.someWebClient = WebClient.builder()
        .baseUrl(someConfiguration.getApiUrl())
        .clientConnector(buildTimeoutConnector())
        .defaultHeaders(httpHeaders -> 
          httpHeaders.addAll(createHeaders(token));
        )
        .build();

【讨论】:

【参考方案3】:

你可以这样做:

WebClient client3 = WebClient
      .builder()
        .baseUrl(someConfiguration.getApiUrl())
        .clientConnector(buildTimeoutConnector())
        .defaultHeader(HttpHeaders.ACCEPT, V1_PUBLIC) 
        .defaultHeader(HttpHeaders.HOST, "abc") 
        .defaultHeader(HttpHeaders.AUTHORIZATION, "Bearer " + token) 
      .build();

【讨论】:

以上是关于WebClient - 添加 defaultHeaders的主要内容,如果未能解决你的问题,请参考以下文章

用vsphere webclient怎么添加iscsi存储

使用 WebClient C# 添加请求标头

如何将弹性 4j 重试添加到 spring boot 2 webclient 调用?

WebClient - 如何获取请求正文?

Webclient maven依赖错误

如何在 Spring WebClient 中拦截 http 流量?