WebClient - 添加 defaultHeaders

WebClient - adding defaultHeaders

我正在尝试将多个 header 放入 defaultHeaders(),但我不知道如何从 createHeaders() 方法的 return 创建消费者 object

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

我可以这样构建我的 header:

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中呢?

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

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

使用这个。

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