SpringBoot - 网络请求客户端WebClient使用详解

在 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,利用 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());

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)")
        .defaultCooki
  • 36
    点赞
  • 132
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用SpringBoot创建客户端使用HTTP/2请求接口的步骤: 1. 添加maven依赖 首先在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-tcnative-boringssl-static</artifactId> <version>2.0.34.Final</version> </dependency> ``` 这些依赖将为你提供使用HTTP/2的必要组件。 2. 创建WebClient对象 WebClient是Spring WebFlux提供的用于发送HTTP请求客户端库,可以非常方便地发送HTTP请求并处理响应。创建WebClient对象需要使用ReactorNetty的HttpClient,并将其设置到WebClient的构造函数中。在设置HttpClient时,需要启用对HTTP/2的支持。 ```java import io.netty.handler.ssl.SslContextBuilder; import io.netty.handler.ssl.util.InsecureTrustManagerFactory; import org.springframework.http.client.reactive.ReactorClientHttpConnector; import org.springframework.web.reactive.function.client.WebClient; import reactor.netty.http.client.HttpClient; import javax.net.ssl.SSLException; import java.time.Duration; public class MyClient { public static void main(String[] args) throws SSLException { SslContextBuilder sslContextBuilder = SslContextBuilder.forClient() .trustManager(InsecureTrustManagerFactory.INSTANCE); HttpClient httpClient = HttpClient.create() .secure(sslContextSpec -> sslContextSpec.sslContext(sslContextBuilder)) .protocol(HttpClient.HttpProtocol.H2) .responseTimeout(Duration.ofSeconds(5)); ReactorClientHttpConnector connector = new ReactorClientHttpConnector(httpClient); WebClient client = WebClient.builder() .clientConnector(connector) .build(); // 使用client发送请求 } } ``` 在这里,我们首先使用SslContextBuilder创建一个SSL上下文,以便我们可以在不验证服务器证书的情况下与服务器建立安全连接。然后,我们使用HttpClient.create()创建一个HttpClient实例,并启用了对HTTP/2的支持,同时设置了响应超时时间。接下来,我们使用ReactorClientHttpConnector将HttpClient连接到WebClient中。最后,我们使用WebClient.builder()创建一个WebClient实例,并将ReactorClientHttpConnector设置为其连接器。 3. 发送HTTP请求 创建WebClient对象后,我们可以使用其get()、post()、put()、delete()等方法发送HTTP请求。 例如,我们可以使用以下代码向http://localhost:8080/hello发送一个HTTP GET请求: ```java Mono<String> result = client.get() .uri("http://localhost:8080/hello") .retrieve() .bodyToMono(String.class); result.subscribe(System.out::println); ``` 在这里,我们使用WebClient向http://localhost:8080/hello发送了一个HTTP GET请求,并将响应体转换为Mono<String>对象,然后异步订阅它并打印结果。 总之,以上是使用SpringBoot创建客户端使用HTTP/2请求接口的基本步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值