如何在 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);
我试图将 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);