4.14 使用WebClient调用REST服务

优质
小牛编辑
124浏览
2023-12-01

如果类路径上有SpringWebFlux,还可以选择使用WebClient调用远程REST服务。与RestTemplate相比,这个客户端具有更多的功能感和完全的反应性。您可以在SpringFrameworkdocs中的专用部分中了解更多关于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);
	}

}

4.14.1 运行时WebClient

Spring Boot将自动检测用于驱动WebClient的ClientHttpConnector,具体取决于应用程序类路径上可用的库。 目前,支持Reactor Netty和Jetty RS客户端。

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

开发人员可以通过提供自定义的ReactorResourceFactory或JettyResourceFactory bean来覆盖Jetty和Reactor Netty的资源配置 - 这将应用于客户端和服务器。

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

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

4.14.2 自定义WebClient

WebClient自定义有三种主要方法,具体取决于您希望自定义应用的广泛程度。

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

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