首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Spring WebClient中一次设置多个headers?

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

Stack Overflow用户
提问于 2019-12-02 14:13:10
回答 3查看 27.9K关注 0票数 11

我试着给我的rest客户端设置头文件,但每次我都要写

代码语言:javascript
运行
复制
webclient.get().uri("blah-blah")
         .header("key1", "value1")
         .header("key2", "value2")...

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-12-05 17:29:33

如果这些标头在每个请求的基础上发生变化,您可以使用:

代码语言:javascript
运行
复制
webClient.get().uri("/resource").headers(httpHeaders -> {
    httpHeaders.setX("");
    httpHeaders.setY("");
});

这不会节省太多的输入;因此,对于不会从一个请求更改到另一个请求的标头,您可以在构建客户端时将其设置为默认标头:

代码语言:javascript
运行
复制
WebClient webClient = WebClient.builder().defaultHeader("...", "...").build();
WebClient webClient = WebClient.builder().defaultHeaders(httpHeaders -> {
    httpHeaders.setX("");
    httpHeaders.setY("");
}).build();
票数 20
EN

Stack Overflow用户

发布于 2020-09-29 07:56:41

消费者是正确的,尽管很难想象,尤其是。在完成头文件的工作后,您可以继续在webclient构造中调用其他fluent-composition方法。

....suppose您有一个HttpHeaders (或MutliValue映射)在作用域中保存您的标头。下面是一个使用来自spring cloud gateway的exchange对象的示例:

代码语言:javascript
运行
复制
final HttpHeaders headersFromExchangeRequest = exchange.getRequest().headers();
webclient.get().uri("blah-blah")
    .headers( httpHeadersOnWebClientBeingBuilt -> { 
         httpHeadersOnWebClientBeingBuilt.addAll( headersFromExchangeRequest );
    }
)...

addAll可以接受多值映射。如果这有意义的话。如果没有,让您的IDE作为您的指南。

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

代码语言:javascript
运行
复制
private Consumer<HttpHeaders> getHttpHeadersFromExchange(ServerWebExchange exchange) {
    return httpHeaders -> {
        httpHeaders.addAll(exchange.getRequest().getHeaders());
    };
}
.
.
.
webclient.get().uri("blah-blah")
    .headers(getHttpHeadersFromExchange(exchange))
    ...
票数 3
EN

Stack Overflow用户

发布于 2021-12-29 00:13:26

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

在groovy中,额外问题是groovy闭包语法和java lambda语法都使用->

groovy版本在这里:

代码语言:javascript
运行
复制
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版本如下:

代码语言:javascript
运行
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59133508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档