51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Spring WebClient 设置 Header

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

赞(3)
未经允许不得转载:工具盒子 » Spring WebClient 设置 Header