精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方法详解
本文是精讲响应式WebClient第2篇,前篇的blog访问地址如下:
在上一篇文章为大家介绍了响应式IO模型和WebClient的基本用法。本节来继续深入的为大家介绍:如何使用WebClient作为Http客户端发送GET请求与进行响应结果的接收。
一、block()阻塞式获取响应结果
WebClient客户端既支持同步异步、阻塞与非阻塞IO,我们先来为大家介绍一下同步阻塞式的编程方式。即:在请求发送之后使用block()方法,阻塞当前线程等待获取响应结果。
1.1.使用Mono接收单个对象
创建测试用例,成员变量WebClient,以 "http://jsonplaceholder.typicode.com" 为访问服务基础路径,该网站是一个免费提供RESTful API进行接口测试的一个网站。
public class GetTest { //创建webClient private WebClient webClient = WebClient.builder() .baseUrl("http://jsonplaceholder.typicode.com") .build(); [@Test](https://my.oschina.net/azibug) public void testMono() { Mono<PostDTO> mono = webClient .get() // 发送GET 请求 .uri("/posts/1") //服务请求路径,基于baseurl .retrieve() // 获取响应体 .bodyToMono(PostDTO.class); //响应数据类型转换 System.out.println(mono.block()); } }
- get() 方法表示使用HTTP GET method
- uri() 指定服务接口路径,以baseurl为基础
- retrieve() 获取响应体,即HTTP body
- bodyToMono()将响应体转换为一个对象,Mono英文是单声道、单体的意思,用于接收单个对象
通过浏览器访问 "http://jsonplaceholder.typicode.com/posts/1" 得到JSON响应结果,和我们通过程序打印出的响应结果数据内容一致。程序控制台截图如下:
接收响应结果的java POJO实体对象如下:
import lombok.Data; [@Data](https://my.oschina.net/difrik) public class PostDTO { private int userId; private int id; private String title; private String body; }
1.2.使用Flux接收集合对象
访问http://jsonplaceholder.typicode.com/posts 可以获得JSON数组方式的请求结果如图(一共100条我截图截取3条记录):
所以我们需要通过bodyToFlux方法将请求结果转为
Flux<PostDTO>
,通过flux.collectList().block();
接收响应数据为 List<PostDTO>
集合。Flux英文含义:流动的,用于接收集合元素响应结果。
[@Test](https://my.oschina.net/azibug) public void testFlux() { Flux<PostDTO> flux = webClient .get() // 发送GET 请求 .uri("/posts") //服务请求路径,基于baseurl .retrieve() // 获取响应体 .bodyToFlux(PostDTO.class); //响应数据类型转换 List<PostDTO> posts = flux.collectList().block(); assert posts != null; System.out.println("获取posts集合元素数量:" + posts.size()); }
控制台打印结果如下:
二、subscribe()非阻塞式获取响应结果
与block()阻塞式获取响应结果不同,使用subscribe()异步订阅响应结果,不会阻塞主线程继续向下执行。获取到响应结果之后,由回调函数handleResponse处理响应结果。
[@Test](https://my.oschina.net/azibug) public void testSubscribe() throws InterruptedException { Mono<PostDTO> mono = webClient .get() // 发送GET 请求 .uri("/posts/1") //服务请求路径,基于baseurl .retrieve() // 获取响应体 .bodyToMono(PostDTO.class); //响应数据类型转换 //异步非阻塞处理响应结果 mono.subscribe(GetTest::handleResponse); //为了避免测试用例主线程执行完成,导致看不到异步处理结果 Thread.currentThread().sleep(10000); } //响应结果处理回调方法 private static void handleResponse(PostDTO postDTO) { System.out.println("handle response:======================="); System.out.println(postDTO); }
控制台打印输出结果如下:
三、exchange()获取HTTP响应完整内容
上文中retrieve()只能获取HTTP报文中的Body,也就是响应体。如果我们想获取HTTP报文中的状态码、headers、cookies等信息,需要使用exchange()方法。
[@Test](https://my.oschina.net/azibug) public void testExchange() { Mono<ClientResponse> mono = webClient .get() // 发送GET 请求 .uri("/posts/1") //服务请求路径,基于baseurl .exchange(); System.out.println(mono.block()); // 获取完整的响应对象 ClientResponse response = mono.block(); assert response != null; HttpStatus httpStatus = response.statusCode(); // 获取响应状态 int statusCodeValue = response.rawStatusCode(); // 获取响应状态码 ClientResponse.Headers headers = response.headers(); // 获取响应头 // 获取响应体 Mono<PostDTO> resultMono = response.bodyToMono(PostDTO.class); PostDTO postDTO = resultMono.block(); // 输出结果 System.out.println("响应状态:" + httpStatus); System.out.println("响应状态码值:" + statusCodeValue); System.out.println("HTTP Headers:" + headers.asHttpHeaders()); System.out.println("响应体:" + postDTO); }
HTTP报文信息详情控制台打印结果
四、占位符传参
非占位符传参,写死的参数方式不灵活
.uri("/posts/1") //服务请求路径,基于baseurl
第一种占位符传参:数字顺序占位符
Mono<String> mono = webClient.uri("/{1}/{2}", "posts", "1")
第二种占位符传参:参数名称占位符
String type = "posts"; int id = 1; Mono<String> mono = webClient.uri("/{type}/{id}", type, id)
第三种通过map传参
Map<String,Object> map = new HashMap<>(); map.put("type", "posts"); map.put("id", 1); Mono<String> mono = webClient .uri("/{type}/{id}", map)
欢迎关注我的博客,里面有很多精品合集
- 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
没想到,Git居然有3种“后悔药”!
你知道Git版本控制系统中都有哪些“后悔药”吗? 本文通过案例讲解git reset 、 git revert 、 git checkout在版本控制中的作用; 场景 小明同学作为新人加入到一个新的项目组中做开发,在项目的迭代开发中,小明勤勤恳恳的写代码,直到有一次... 小明:完了,完蛋了 洋仔:怎么了,一惊一乍的 小明:我把错误代码用git commit后还push到线上代码库了! 这可怎么办! 洋仔:莫慌,git有“后悔药”! 洋仔:容我给你慢慢道来。 但是我们要先知道一些git的基础知识,你才能更好的理解git命令的作用 预备知识 git将项目的存储分为4部分,每部分有自己作用, 见下图: Workspace:工作区(当前用户操作修改的区域) Index / Stage:暂存区 (add后的区域) Repository:仓库区或本地仓库(commit后的区域) Remote:远程仓库(push后的区域) 整体过程可以简述为: 工作区–>add–>暂存区–>commit–>本地仓库区–>push–>远程仓库区 远程仓库区–>fetch–&...
- 下一篇
HBuilderX 2.8.8 发布,免费稳定的 markdown 图床,工具一键集成
HBuilderX简介 HBuilderX是一款免费的前端开发工具(IDE),C++内核架构:轻巧、极速,是轻如编辑器、强如IDE的合体版本。查看详细介绍。 HBuilderX 2.8.8, 免费稳定的markdown图床,工具一键集成 MarkDown作为一种纯文本格式的标记语言,通过简单的标记语法,就使普通文本内容具有一定的格式。一次标记可以做到各平台通用,免除了富文本编辑器换平台就要重新排版的繁琐。 但使用markdown也有一个重要的问题,那就是图片的存储,markdown文件要用到图片时必须是一个链接,在不使用图床的情况下,编辑上传图片太麻烦。 解决办法就是使用图床来单独存储图片。 于是, HBuilderX 2.8.8, 推出了 MarkDown一键分享功能。使用uniCloud作为图床 什么是uniCloud?,可靠、安全、简单易用、免费。 markdown一键分享,顾名思义是在HBuilderX中写好的markdown文档,可以简单通过编辑器右键【一键分享】菜单或者快捷键上传到云端,并生成分享链接,并且完全免费! 文档引用到本地图片会自动解析一并上传到云端。 更多:Ma...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS关闭SELinux安全模块