前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WebClient 实践

WebClient 实践

原创
作者头像
水货程序员
发布2019-01-29 23:01:00
5.2K0
发布2019-01-29 23:01:00
举报
文章被收录于专栏:javathingsjavathings

Spring 发展很快,Spring 5 已经出来很久了,但有些新的特性却还没怎么研究过, 比如 WebClient。

WebClient 被称作响应式 web 客户端,如何理解响应式,其实就是快速响应用户。传统的 RestTemplate 正好和其相对,它不是快速响应用户,它会阻塞代码,直到 http 请求返回响应才会继续运行下去,而 WebClient 则是异步执行,不阻塞代码。所以,WebClient 的出现就是为了替换掉 RestTemplate 或者 AsyncRestTemplate,它能够以少量的线程数处理高并发的 Http 请求。官方的文档也有说明: NOTE: As of 5.0, the non-blocking, reactive org.springframework.web.reactive.client.WebClient offers a modern alternative to the RestTemplate with efficient support for both sync and async, as well as streaming scenarios. The RestTemplate will be deprecated in a future version and will not have major new features added going forward.

需要注意的是 webclient 方式,并不能提升程序的性能,它的价值在于用有限的资源提高系统的吞吐量和伸缩性。

使用 WebClient 时,Maven 引用如下:

代码语言:javascript
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
    <groupId>org.projectreactor</groupId>
    <artifactId>reactor-spring</artifactId>
    <version>1.0.1.RELEASE</version>
</dependency>

创建 WebClient 实例的 3 种方式:

第一种,使用 WebClient 接口的默认方法

WebClient webClient = WebClient.create();

第二种,使用给出 URI 参数

WebClient webClient = WebClient.create("http://localhost:8080");

第三种也是最复杂的一种,使用 DefaultWebClientBuilder 类

代码语言:javascript
复制
WebClient webClient = WebClient
.builder()
.baseUrl("http://localhost:8080")
.defaultCookie("cookieKey", "cookieValue")
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.defaultUriVariables(Collections.singletonMap("url", "http://localhost:8080"))
.build();

WebClient 发起请求的代码如下:

代码语言:javascript
复制
指定Http方法
webclient .method(HttpMethod.POST);
或
webclient .post(HttpMethod.POST);
Java

输入请求地址:

代码语言:javascript
复制
WebClient.RequestBodySpec uri1 = webclient
 .method(HttpMethod.POST)
 .uri("/resource");

我们可以为请求设置请求体,cookie,headers 等,例如:

设置 Content-Type,Post Json 数据,requestType 会被序列化成 Json 数据。

代码语言:javascript
复制
Mono<RestfulResponse> re = webclient
.post().uri("/checkToken")
.contentType(MediaType.APPLICATION_JSON_UTF8)
.body(Mono.just(requestType), MyRequestType.class)
代码语言:javascript
复制
如果要 Post 原生的 Json 串,也容易,上述代码改成:
Mono<RestfulResponse> re = webclient
.post().uri("/checkToken")
.contentType(MediaType.APPLICATION_JSON_UTF8)
.body(BodyInserters.fromObject("{\"name\":\"zhangsan\"}"))

带上 Cookie

代码语言:javascript
复制
Mono<String> resp = WebClient.create()
 .method(HttpMethod.GET)
 .uri("http://localhost:8080")
 .cookie("name","zhang")
 .cookie("id","99999")
 .retrieve()
 .bodyToMono(String.class);

WebClient 发送请求的方法是异步执行的,在发送完毕后,程序继续往下运行,但也可以通过阻塞程序来等待请求的响应。

获得响应有 2 种方法,exchange 和 retrieve 方法。两者返回类型不同,exchange 返回的内容更多,包含了响应头信息,Cookie,状态码等信息,它的类型本质上是 ClientResponse。retrieve 方法则是获得响应 body 的快捷方式。由于响应的得到是异步的,所以可以调用 block 方法来阻塞当前程序,等待获得响应的结果。

代码语言:javascript
复制
String response2 = request1.exchange()
.block()
.bodyToMono(String.class)
.block();
代码语言:javascript
复制
String response3 = request2
.retrieve()
.bodyToMono(String.class)
.block();

我们还可以通过拉姆达表达式,采用函数式编程的方式,注册相应的事件响应。例如,可以使用 onStatus 处理响应状态,doOnError,onErrorReturn 进行错误处理。

WebClient 获得响应有 2 个方法 bodyToMono 和 bodyToFlux,这两者返回的类型分别是 Mono<T> 和 Flux<T>。两者的区别在于 Mono<T> 的响应结果,仅包含 0-1 个结果,而 Flux<T> 可以包含多个结果。

WebClient 使用简单友好,熟悉 http 协议的人会很容易上手,一旦熟练掌握后,会提高开发效率和程序的吞吐量和伸缩性。

更多知识可以参考下面的链接:

https://www.baeldung.com/spring-5-webclient

https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux-client

https://www.jianshu.com/p/faeb540f30ce

http://www.leftso.com/blog/404.html

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档