我尝试为我的其他客户端设置标头,但每次我都必须写入
webclient.get().uri("blah-blah") .header("key1", "value1") .header("key2", "value2")...
如何使用headers()方法同时设置所有头文件?
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();
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)) ...
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);
r1zhe5dt4#
在 Spring Boot 2.7.5中:
2.7.5
webClient .get() .uri("blah-blah") .headers( httpHeaders -> { httpHeaders.set("key1", "value1"); httpHeaders.set("key2", "value2"); })
4条答案
按热度按时间3hvapo4f1#
如果这些标头根据每个请求而更改,则可以用途:
这并不保存大量的输入;因此,对于不会随请求而变化的标头,您可以在构建客户端时将其设置为默认标头:
7gyucuyw2#
消费者是正确的,尽管很难可视化,特别是在你完成了头的工作之后,你可以继续在webclient构造中调用其他的fluent-composition方法。
....假设您有一个HttpHeaders(或MutliValueMap),它将您的头保存在作用域中。下面是一个示例,使用来自Spring Cloud Gateway的一个Exchange对象:
addAll可以接受一个多值Map。2如果这有意义话。3如果没有意义的话,让你的IDE作为你的指南。
为了让消费者更清楚,让我们将上面的内容重写如下:
wvmv3b1j3#
我发现这个问题再次出现在我身上,这次我直接使用WebClient编写groovy。同样,我尝试驱动的示例使用Consumer作为头方法调用的参数。
在groovy中,另外一个问题是groovy闭包语法和java lambda语法都使用
->
。groovy版本如下:
Java版本如下:
r1zhe5dt4#
在 Spring Boot
2.7.5
中: