35. 使用 WebClient 调用 REST 服务

如果您的 Classpath 中包含 Spring WebFlux,则还可以选择使用WebClient来调用远程 REST 服务。与RestTemplate相比,此 Client 端具有更多的功能感,并且具有完全的 Reactive。您可以在专用的Spring Framework 文档中的部分中了解有关WebClient的更多信息。

Spring Boot 为您创建并预配置了WebClient.Builder;强烈建议将其注入您的组件中并使用它来创建WebClient实例。 Spring Boot 正在配置该构建器以共享 HTTP 资源,以与服务器相同的方式反映编解码器的设置(请参阅WebFlux HTTP 编解码器自动配置),以及更多。

以下代码显示了一个典型示例:

@Service
public class MyService {

	private final WebClient webClient;

	public MyService(WebClient.Builder webClientBuilder) {
		this.webClient = webClientBuilder.baseUrl("http://example.org").build();
	}

	public Mono<Details> someRestCall(String name) {
		return this.webClient.get().uri("/{name}/details", name)
						.retrieve().bodyToMono(Details.class);
	}

}

35.1 WebClient 运行时

Spring Boot 将根据应用程序 Classpath 上可用的库自动检测要使用哪个ClientHttpConnector来驱动WebClient。目前,还支持 Reactor Netty 和 Jetty RS Client 端。

默认情况下,spring-boot-starter-webflux启动程序取决于io.projectreactor.netty:reactor-netty,这同时带来了服务器和 Client 端实现。如果选择使用 Jetty 作为反应式服务器,则应在 Jetty 反应式 HTTP Client 端库org.eclipse.jetty:jetty-reactive-httpclient上添加依赖项。对服务器和 Client 端使用相同的技术具有其优势,因为它将自动在 Client 端和服务器之间共享 HTTP 资源。

通过提供自定义的ReactorResourceFactoryJettyResourceFactory bean,开发人员可以覆盖 Jetty 和 Reactor Netty 的资源配置-这将同时应用于 Client 端和服务器。

如果您希望为 Client 端覆盖该选择,则可以定义自己的ClientHttpConnector bean 并完全控制 Client 端配置。

您可以了解有关Spring Framework 参考文档中的 WebClient 配置选项的更多信息。

35.2 WebClient 自定义

WebClient自定义有三种 Main 方法,具体取决于您希望自定义应用的范围。

要使所有自定义项的范围尽可能缩小,请注入自动配置的WebClient.Builder,然后根据需要调用其方法。 WebClient.Builder实例是有状态的:构建器上的任何更改都会反映在随后使用它创建的所有 Client 端中。如果要使用同一构建器创建多个 Client 端,则也可以考虑使用WebClient.Builder other = builder.clone();克隆该构建器。

要对所有WebClient.Builder实例进行应用程序级的附加自定义,您可以声明WebClientCustomizer bean 并在注入点更改WebClient.Builder

最后,您可以使用原始 API 并使用WebClient.create()。在这种情况下,不会应用任何自动配置或WebClientCustomizer