1、简介 {#1简介}
WebClient
是 Spring WebFlux 中的一个 HTTP 客户端工具类,可以实现同步和异步 HTTP 请求。
本文将带你了解在 Spring WebClient
中设置 Header 的几种方式。
2、WebClient 如何处理 Header? {#2webclient-如何处理-header}
一般来说,HTTP 请求中的 Header 起到元数据的作用。它们包含认证详细信息、内容类型、版本等信息。
在 WebClient
中,HttpHeaders
类负责管理 Header。这是一个 Spring 框架类,专门用于表示请求和响应头。该类实现了 MultiValueMap<String, String>
,允许一个 Header Key 有多个 Value。
这为需要多个值的 Header(如 Accept
)提供了灵活性。
3、在 WebClient 中设置 Header {#3在-webclient-中设置-header}
有几种方法可以为请求添加 Header。根据使用情况,我们可以为单个请求设置 Header,为整个 WebClient
实例定义全局 Header,或动态修改 Header。
3.1、为单个请求设置 Header {#31为单个请求设置-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 {#32全局设置默认-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 {#33使用-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、总结 {#4总结}
本文介绍了 Spring WebClient
如何处理 Header,以及多种设置 Header 的方法。
无论是针对单个请求、全局所有请求,还是在运行时动态设置,WebClient
都提供了直接而灵活的方法,可以一致而简洁地管理 Header。
Ref:https://www.baeldung.com/java-spring-webclient-set-headers