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

Ami*_*mar 8 rest-client resttemplate java-8 spring-boot spring-webclient

我试图为我的休息客户端设置标题,但每次我必须写

webclient.get().uri("blah-blah")
         .header("key1", "value1")
         .header("key2", "value2")...
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*zel 16

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

webClient.get().uri("/resource").headers(httpHeaders -> {
    httpHeaders.setX("");
    httpHeaders.setY("");
});
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这是一个正确的例子,实际上它是一个非常好的例子。如果您不理解它,您可能需要研究 lambda 和函数式接口。如果刚开始,不要指望它能很快学会,第一次很难掌握它:) (3认同)

Bob*_*ski 7

消费者是正确的,尽管很难想象,尤其是。因为在完成标头工作后,您可以继续在 Web 客户端构造中进行其他流畅组合方法调用。

....假设您有一个 HttpHeaders (或 MutliValue 映射)将您的标头保留在范围内。这是一个使用 Spring Cloud Gateway 中的交换对象的示例:

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

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

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

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