本文是精讲响应式WebClient第2篇,前篇的blog访问地址如下:

  • 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法

在上一篇文章为大家介绍了响应式IO模型和WebClient的基本用法。本节来继续深入的为大家介绍:如何使用WebClient作为Http客户端发送GET请求与进行响应结果的接收。

一、block()阻塞式获取响应结果

WebClient客户端既支持同步异步、阻塞与非阻塞IO,我们先来为大家介绍一下同步阻塞式的编程方式。即:在请求发送之后使用block()方法,阻塞当前线程等待获取响应结果。

1.1.使用Mono接收单个对象

创建测试用例,成员变量WebClient,以 “http://jsonplaceholder.typicode.com” 为访问服务基础路径,该网站是一个免费提供RESTful API进行接口测试的一个网站。

public class GetTest {//创建webClientprivate WebClient webClient = WebClient.builder().baseUrl("http://jsonplaceholder.typicode.com").build();@Testpublic 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
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
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
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
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)

欢迎关注我的博客,里面有很多精品合集

  • 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。

觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

  • 《手摸手教你学Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2一本通》
  • 《实战前后端分离RBAC权限管理系统》
  • 《实战SpringCloud微服务从青铜到王者》
  • 《VUE深入浅出系列》

精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方法详解相关推荐

  1. 精讲响应式WebClient第3篇-POST、DELETE、PUT方法使用

    本文是精讲响应式WebClient第3篇,前篇的blog访问地址如下: 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方 ...

  2. 精讲响应式WebClient第4篇-文件上传与下载

    本文是精讲响应式WebClient第4篇,前篇的blog访问地址如下: 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方 ...

  3. struct用法_精讲响应式webclient第1篇-响应式非阻塞IO与基础用法

    笔者在之前已经写了一系列的关于RestTemplate的文章,如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层HT ...

  4. 响应式编程之二:RxJava概述:在Android平台上开发详解

    RxJava 到底是什么 RxJava 好在哪 API 介绍和原理简析 1. 概念:扩展的观察者模式 观察者模式 RxJava 的观察者模式 2. 基本实现 1) 创建 Observer 2) 创建 ...

  5. 站长在线Python精讲:Python中集合的交集、并集、差集和对称差集运算方法详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<Python中集合的交集.并集.差集和对称差集运算方法详解>.主要讲的是集合运算的相关的概念,及运算方法,包括:集合的交集. ...

  6. setstate是同步还是异步_【vert.x准备篇1】同步和异步,阻塞和非阻塞概念澄清

    为了能更好的理解vert.x的线程模型,我们必须要先明确几个概念:同步(Synchronous)和异步(Asynchronous),阻塞(Blocking)和非阻塞(Non-Blocking).关于这 ...

  7. 系统间通信1:阻塞与非阻塞式通信B

    版权声明:本文引用https://yinwj.blog.csdn.net/article/details/48274255 接上篇:系统间通信1:阻塞与非阻塞式通信A 4.3 NIO通信框架 目前流行 ...

  8. 写的非常不错的一篇阻塞与非阻塞、同步与异步套接字之间的区别

    当你发现自己最受欢迎的一篇blog其实大错特错时,这绝对不是一件让人愉悦的事. < IO - 同步,异步,阻塞,非阻塞 >是我在开始学习epoll和libevent的时候写的,主要的思路来 ...

  9. 初出茅庐的小李第3篇博客《5G物联网及NB-IoT技术详解》读书笔记1

    初出茅庐的小李第3篇博客 <5G物联网及NB-IoT技术详解>读书笔记1 在Mculover666那里白嫖了一本书,不要问我咋白嫖的,我也不知道- 为什么要写这样的笔记? 因为我白嫖的时候 ...

最新文章

  1. Python培训教程分享:Python异常机制
  2. apache camel 相关配置_Apache Camel的Java编程入门指南
  3. Android开发之设置listview分割线的颜色
  4. 【Codeforces 631C 】Report(单调栈,思维模拟)
  5. hadoop--hadoop集群常用脚本
  6. zh-cn en-uk、zh-tw表示语言(文化)代码与国家地区对照表(最全的各国地区对照表)...
  7. 鸿蒙开发版发布会现场直播开奖记录,首发鸿蒙OS 荣耀智慧屏系列发布会直播
  8. Flask-login 原理
  9. Vue3传值(一) props: 父组件向子组件传值
  10. python deap,安装Deap for Python(Spyder)
  11. Syzmlw蜗居在线播放
  12. Java实现--身高预测
  13. 一次让人晕到吐血的接包经历
  14. 【人脸识别6】用haar+adaboost训练自己的人脸检测器
  15. 教你如何更改U盘图标
  16. web调用身份证读卡器品牌选择及技术实现
  17. JavaScript今日所学 数组
  18. PDF文档在线翻译怎么操作
  19. AMD的GPU拿来跑深度学习,Rocm3.0Pytorch@Ubuntu16 编译记录
  20. 植物大战僵尸阳光值修改以及阳光基地址寻找详细步骤~包含排除不符合条件的地址的讲解,以及如何观察地址情况等

热门文章

  1. 一个工程师的工程文化
  2. 《云计算》linux改变主机名的四种方法
  3. 转:Metalink 账户
  4. 防伪防窜货库存管理系统解决方案
  5. Winbox配置PPPOE的参数
  6. .net连接Sql时出现已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: TCP 提供程序, error: 0 - 指定的网络名不再可用。) ...
  7. java websphere_将Java Web 应用部署至 WebSphere 7
  8. midi格式的音频数据显示为图片形式
  9. MSN Messenger无法登陆
  10. 3D桌面(bumptop)-感觉挺爽!