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

How to set multiple headers at once in Spring WebClient?

我试图将 headers 设置为我的休息客户端,但每次我都必须写

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

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

如果这些 headers 根据请求发生变化,您可以使用:

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

这并没有节省多少输入;因此对于不会从一个请求更改为另一个请求的 headers,您可以在构建客户端时将它们设置为默认值 headers:

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

消费者是正确的,尽管很难想象,尤其是。因为在使用 headers.

完成工作后,您可以继续在 webclient 构造中调用其他 fluent-composition 方法

...假设您有一个 HttpHeaders(或 MutliValue 映射)在范围内保存您的 headers。这是一个示例,使用来自 spring 云网关的交换 object:

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

addAll 可以采用多值映射。如果这是有道理的。如果没有,让您的 IDE 成为您的向导。

为了让消费者更清楚,我们将上面的改写如下:

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

我发现这个问题又出现在我身上,这次我是直接使用 WebClient 编写 groovy。同样,我尝试驱动的示例是使用 Consumer 作为 headers 方法调用的参数。

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