Spring Boot 如何在Spring WebClient中一次设置多个头?

fnatzsnv  于 2022-11-05  发布在  Spring
关注(0)|答案(4)|浏览(291)

我尝试为我的其他客户端设置标头,但每次我都必须写入

webclient.get().uri("blah-blah")
         .header("key1", "value1")
         .header("key2", "value2")...

如何使用headers()方法同时设置所有头文件?

3hvapo4f

3hvapo4f1#

如果这些标头根据每个请求而更改,则可以用途:

webClient.get().uri("/resource").headers(httpHeaders -> {
    httpHeaders.setX("");
    httpHeaders.setY("");
});

这并不保存大量的输入;因此,对于不会随请求而变化的标头,您可以在构建客户端时将其设置为默认标头:

WebClient webClient = WebClient.builder().defaultHeader("...", "...").build();
WebClient webClient = WebClient.builder().defaultHeaders(httpHeaders -> {
    httpHeaders.setX("");
    httpHeaders.setY("");
}).build();
7gyucuyw

7gyucuyw2#

消费者是正确的,尽管很难可视化,特别是在你完成了头的工作之后,你可以继续在webclient构造中调用其他的fluent-composition方法。
....假设您有一个HttpHeaders(或MutliValueMap),它将您的头保存在作用域中。下面是一个示例,使用来自Spring Cloud Gateway的一个Exchange对象:

final HttpHeaders headersFromExchangeRequest = exchange.getRequest().headers();
webclient.get().uri("blah-blah")
    .headers( httpHeadersOnWebClientBeingBuilt -> { 
         httpHeadersOnWebClientBeingBuilt.addAll( headersFromExchangeRequest );
    }
)...

addAll可以接受一个多值Map。2如果这有意义话。3如果没有意义的话,让你的IDE作为你的指南。
为了让消费者更清楚,让我们将上面的内容重写如下:

private Consumer<HttpHeaders> getHttpHeadersFromExchange(ServerWebExchange exchange) {
    return httpHeaders -> {
        httpHeaders.addAll(exchange.getRequest().getHeaders());
    };
}
.
.
.
webclient.get().uri("blah-blah")
    .headers(getHttpHeadersFromExchange(exchange))
    ...
wvmv3b1j

wvmv3b1j3#

我发现这个问题再次出现在我身上,这次我直接使用WebClient编写groovy。同样,我尝试驱动的示例使用Consumer作为头方法调用的参数。
在groovy中,另外一个问题是groovy闭包语法和java lambda语法都使用->
groovy版本如下:

def mvmap = new LinkedMultiValueMap<>(headersAsMap)
def consumer = { it -> it.addAll(mvmap) } as Consumer<HttpHeaders>

WebClient client = WebClient.create(baseUrlAsString)
def resultAsMono = client.post()
        .uri(uriAsString).accept(MediaType.APPLICATION_JSON)
        .headers(consumer)
        .body(Mono.just(payload), HashMap.class)
        .retrieve()
        .toEntity(HashMap.class)

Java版本如下:

LinkedMultiValueMap mvmap = new LinkedMultiValueMap<>(headersAsMap);
Consumer<HttpHeaders> consumer = it -> it.addAll(mvmap);

WebClient client = WebClient.create(baseUrlAsString);
Mono<ResponseEntity<HashMap>> resultAsMono = client.post()
        .uri(uriAsString).accept(MediaType.APPLICATION_JSON)
        .headers(consumer)
        .body(Mono.just(payload), HashMap.class)
        .retrieve()
        .toEntity(HashMap.class);
r1zhe5dt

r1zhe5dt4#

在 Spring Boot 2.7.5中:

webClient
  .get()
    .uri("blah-blah")
      .headers(
        httpHeaders -> {
          httpHeaders.set("key1", "value1");
          httpHeaders.set("key2", "value2");
        })

相关问题