Spring WebClient 设置 Header
1、简介
WebClient
是 Spring WebFlux 中的一个 HTTP 客户端工具类,可以实现同步和异步 HTTP 请求。
本文将带你了解在 Spring WebClient
中设置 Header 的几种方式。
2、WebClient 如何处理 Header?
一般来说,HTTP 请求中的 Header 起到元数据的作用。它们包含认证详细信息、内容类型、版本等信息。
在 WebClient
中,HttpHeaders
类负责管理 Header。这是一个 Spring 框架类,专门用于表示请求和响应头。该类实现了 MultiValueMap<String, String>
,允许一个 Header Key 有多个 Value。
这为需要多个值的 Header(如 Accept
)提供了灵活性。
3、在 WebClient 中设置 Header
有几种方法可以为请求添加 Header。根据使用情况,我们可以为单个请求设置 Header,为整个 WebClient
实例定义全局 Header,或动态修改 Header。
3.1、为单个请求设置 Header
如果 Header 是针对单个请求的,并且因端点而异,那么直接的方法就是在请求中直接设置它们。
一个简单的示例如下。例化 WebClient
,在请求中添加了两个 Header,并断言这些 Header 已通过请求发送。使用 okhttp3 库中的 MockWebServer
来模拟服务器响应并验证 WebClient 的行为:
@Test
public void givenRequestWithHeaders_whenSendingRequest_thenAssertHeadersAreSent() throws Exception {
mockWebServer.enqueue(new MockResponse().setResponseCode(HttpStatus.OK.value()));
WebClient client = WebClient.builder()
.baseUrl(mockWebServer.url("/").toString())
.build();
ResponseEntity<Void> response = client.get()
.headers(headers -> {
headers.put("X-Request-Id", Collections.singletonList(RANDOM_UUID));
headers.put("Custom-Header", Collections.singletonList("CustomValue"));
})
.retrieve()
.toBodilessEntity()
.block();
assertNotNull(response);
assertEquals(HttpStatusCode.valueOf(HttpStatus.OK.value()), response.getStatusCode());
RecordedRequest recordedRequest = mockWebServer.takeRequest();
assertEquals(RANDOM_UUID, recordedRequest.getHeader("X-Request-Id"));
assertEquals("CustomValue", recordedRequest.getHeader("Custom-Header"));
}
本例使用了 WebClient
类中的 headers(Consumer<HttpHeaders> headersConsumer)
方法。
如前所述,WebClient
依赖于 HttpHeaders
,而 HttpHeaders
是使用 Consumer
接口配置的。通过这种设置,我们可以传递一个对 HttpHeaders
实例进行操作的 lambda 来修改请求头。
3.2、全局设置默认 Header
在其他情况下,我们可能需要定义全局 Header。这些 Header 是在全局级别配置的,它们会自动添加到使用此客户端实例的每个请求中。这种配置可以帮助我们保持一致性并减少重复。
在构建 WebClient
时添加默认的 Header:
WebClient client = WebClient.builder()
.baseUrl(mockWebServer.url("/").toString())
.defaultHeaders(headers -> {
headers.put("X-Request-Id", Collections.singletonList(RANDOM_UUID));
headers.put("Custom-Header", Collections.singletonList("CustomValue"));
})
.build();
3.3、使用 ExchangeFilterFunction 动态修改 Header
在某些情况下,我们可能希望在运行时动态设置或修改报头。在这种情况下,可以使用 ExchangeFilterFunction
类:
ExchangeFilterFunction dynamicHeadersFilter = (request, next) -> next.exchange(ClientRequest.from(request)
.headers(headers -> {
headers.put("X-Request-Id", Collections.singletonList(RANDOM_UUID));
headers.put("Custom-Header", Collections.singletonList("CustomValue"));
})
.build());
创建 ExchangeFilterFunction
实例,在实例化过程中将其注册到 WebClient
:
WebClient client = WebClient.builder()
.baseUrl(mockWebServer.url("/").toString())
.filter(dynamicHeadersFilter)
.build();
可以为一个 WebClient 设置多个 Filter
实例。
4、总结
本文介绍了 Spring WebClient
如何处理 Header,以及多种设置 Header 的方法。
无论是针对单个请求、全局所有请求,还是在运行时动态设置,WebClient
都提供了直接而灵活的方法,可以一致而简洁地管理 Header。
Ref:https://www.baeldung.com/java-spring-webclient-set-headers