SpringBoot - 网络请求客户端WebClient使用详解1(安装配置、基本用法)
在 Spring 5 之前,如果我们想要调用其他系统提供的 HTTP 服务,通常可以使用 Spring 提供的 RestTemplate 来访问,具体可以查看我之前写的相关文章(点击查看)。不过由于 RestTemplate 是 Spring 3 中引入的同步阻塞式 HTTP 客户端,因此存在一定性能瓶颈。根据 Spring 官方文档介绍,在将来的版本中它可能会被弃用。
作为替代,Spring 官方已在 Spring 5 中引入了 WebClient 作为非阻塞式 Reactive HTTP 客户端。下面通过样例演示如何使用 WebClient。
一、基本介绍
1,什么是 WebClient
- 从 Spring 5 开始,Spring 中全面引入了 Reactive 响应式编程。而 WebClient 则是 Spring WebFlux 模块提供的一个非阻塞的基于响应式编程的进行 Http 请求的客户端工具。
- 由于 WebClient 的请求模式属于异步非阻塞,能够以少量固定的线程处理高并发的 HTTP 请求。因此,从 Spring 5 开始,HTTP 服务之间的通信我们就可以考虑使用 WebClient 来取代之前的 RestTemplate。
2,WebClient 的优势
(1)与 RestTemplate 相比,WebClient 有如下优势:
- 非阻塞,Reactive 的,并支持更高的并发性和更少的硬件资源。
- 提供利用 Java 8 lambdas 的函数 API。
- 支持同步和异步方案。
- 支持从服务器向上或向下流式传输。
(2)RestTemplate 不适合在非阻塞应用程序中使用,因此 Spring WebFlux 应用程序应始终使用 WebClient。在大多数高并发场景中,WebClient 也应该是 Spring MVC 中的首选,并且用于编写一系列远程,相互依赖的调用。
3,安装配置
编辑 pom.xml 文件,添加 Spring WebFlux 依赖,从而可以使用 WebClient。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency>
二、创建 WebClient 实例
从 WebClient 的源码中可以看出,WebClient 接口提供了三个不同的静态方法来创建 WebClient 实例:
1,利用 create() 创建
(1)下面利用 create() 方法创建一个 WebClient 对象,并利用该对象请求一个网络接口,最后将结果以字符串的形式打印出来。
注意:由于利用 create() 创建的 WebClient 对象没有设定 baseURL,所以这里的 uri() 方法相当于重写 baseURL。
WebClient webClient = WebClient.create(); Mono<String> mono = webClient .get() // GET 请求 .uri("http://jsonplaceholder.typicode.com/posts/1") // 请求路径 .retrieve() // 获取响应体 .bodyToMono(String.class); //响应数据类型转换 System.out.println(mono.block());
(2)控制台输出结果如下:
2,利用 create(String baseUrl) 创建
(1)下面利用 create(String baseUrl) 方法创建一个 WebClient 对象,并利用该对象请求一个网络接口,最后将结果以字符串的形式打印出来。注意:由于利用 create(String baseUrl) 创建的 WebClient 对象时已经设定了 baseURL,所以 uri() 方法会将返回的结果和 baseUrl 进行拼接组成最终需要远程请求的资源 URL。
WebClient webClient = WebClient.create("http://jsonplaceholder.typicode.com"); Mono<String> mono = webClient .get() // GET 请求 .uri("/posts/1") // 请求路径 .retrieve() // 获取响应体 .bodyToMono(String.class); //响应数据类型转换 System.out.println(mono.block());
(2)控制台输出结果如下:
3,利用 builder 创建(推荐)
(1)下面使用 builder() 返回一个 WebClient.Builder,然后再调用 build 就可以返回 WebClient 对象。并利用该对象请求一个网络接口,最后将结果以字符串的形式打印出来。
注意:由于返回的不是 WebClient 类型而是 WebClient.Builder,我们可以通过返回的 WebClient.Builder 设置一些配置参数(例如:baseUrl、header、cookie 等),然后再调用 build 就可以返回 WebClient 对象了
WebClient webClient = WebClient.builder() .baseUrl("http://jsonplaceholder.typicode.com") .defaultHeader(HttpHeaders.USER_AGENT,"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)") .defaultCookie("ACCESS_TOKEN", "test_token") .build(); Mono<String> mono = webClient .get() // GET 请求 .uri("/posts/1") // 请求路径 .retrieve() // 获取响应体 .bodyToMono(String.class); //响应数据类型转换 System.out.println(mono.block());
(2)控制台输出结果如下: