【问题标题】:WebClient - adding defaultHeadersWebClient - 添加 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 中?

【问题讨论】:

    标签: java spring spring-boot webclient spring-webflux


    【解决方案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 表达式

      1. 使用匿名内部类:
      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();
      

      【讨论】:

        【解决方案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();
        

        【讨论】:

          猜你喜欢
          • 2014-02-23
          • 2023-01-09
          • 2021-12-28
          • 2012-10-27
          • 2014-06-30
          • 1970-01-01
          • 2011-01-05
          • 2022-09-27
          • 2011-11-27
          相关资源
          最近更新 更多