响应式编程理论篇:源码浅析WebClient

news2024/12/23 15:14:08

1 缘起

WebFlux系统中,如何请求第三方或其他内部兄弟系统提供的接口?
当然,可以直接使用OKhttp/Apache HttpClient/SpringMVC RestTemplate,
在WebFlux中同样提供了请求接口的工具:WebClient,
本篇文章主要讲解WebClient的功能,理论篇。
实践篇中讲解如何实战。

2 Webclient

Spring WebClient官方地址:
https://docs.spring.io/spring-framework/reference/web/webflux-webclient.html
在这里插入图片描述

源码位置:org.springframework.web.reactive.function.client.WebClient
先看一下WebClient的注释:
非阻塞响应式发送HTTP请求。
通过底层HTTP客户端库(如Reactor Netty)暴露响应式API。
核心点:

  • 如何构建实例:通过create()、create(String)、builder()方法
  • 如何获取响应结果:通过retrieve()、exchangeToMono()、exchangeToFlux()方法
  • 如何在请求中添加请求体:通过bodyValue(Object)、body(Publisher, Class)方法

接下来以应用的角度讲解WebClient,即:
创建实例->请求方法->请求URI->请求体->结果解析。

在这里插入图片描述

2.1 构建实例

构建WebClinet实例的方法有三个:create()、create(String)、builder()
这三个静态工厂方法都是使用WebClient接口的默认实现类:DefaultWebClientBuilder,
不同的是参数不同:

  • create():默认构建,不带参数;
  • create(String):构建基础URL前缀,如公用的IP和PORT;
  • builder():默认构建,不带参数,构建一个构造器;

在这里插入图片描述
构建WebClient实例后,即可发起HTTP/HTTPS请求,
WebClient接口,通过工厂方法实例化,结合SpringBoot的自动装配机制,
这里使用@PostConstruct启动SpringBoot服务时实例化WebClient,
初始化调用接口的IP和PORT,如:http://192.168.0.123:8888
为后续使用准备。

  • 样例
    private WebClient pyRpcWebClient;

    @PostConstruct
    public void init() {
        pyRpcWebClient = WebClient.builder().baseUrl(rpcPyUrl).build();
    }

2.2 请求方法

接下来,看下请求方法,熟悉的味道:
GET、HEAD、POST、PUT、PATCH、DELETE和OPTIONS方法。
方法列表:
在这里插入图片描述
接口方法:org.springframework.web.reactive.function.client.WebClient
在这里插入图片描述
具体的实现在实现类:
org.springframework.web.reactive.function.client.DefaultWebClient
到这,细节可各位读者深究。
在这里插入图片描述

2.3 配置URI

实例化WebClient,确定请求方法后,接下来需要配置实际请求接口的URI。
方法列表:
在这里插入图片描述
接口类:org.springframework.web.reactive.function.client.WebClient.UriSpec
在这里插入图片描述

默认实现类:
org.springframework.web.reactive.function.client.DefaultWebClient.DefaultRequestBodyUriSpec
具体源码如下:
在这里插入图片描述

2.4 发送请求参数

接下来构建请求参数,如Form-Data、Body类型
WebClient中提供的接口:RequestBodySpec用于配置请求头和请求体。
方法列表:分为两类

  • 请求头:contentType,contentLength
  • 请求体:body、bodyValue

其中,body既可以填充请求体,又可以填充表单数据,或为文件数据。
在这里插入图片描述
RequestBodySpec接口:
org.springframework.web.reactive.function.client.WebClient.RequestBodySpec
在这里插入图片描述

默认实现:
org.springframework.web.reactive.function.client.DefaultWebClient.DefaultRequestBodyUriSpec
在这里插入图片描述

2.5 提取响应结果:retrieve()

WebClient请求接口后,通过retrieve()方法提取接口响应的结果。
ResponseSpec提供的方法如下:
在这里插入图片描述
retrieve类型为:ResponseSpec,
该接口提供了众多结果处理的方式,如将结果转化为Mono、Flux、Entity类型,
并且可以根据onStatus()方法,获取对应响应状态码,进行处理。
Http状态码:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status

序号状态码描述
11xx响应信息
22xx成功响应
33xx重定向
44xx客户端响应异常
55xx服务端响应异常

在这里插入图片描述
接下来分析ResponseSpec接口,该接口是处理响应结果的规约,
如onStatus方法,根据响应状态码处理结果,当异常时,进行对应的处理,
成功时,数据流往下传递;
bodyToMono将结果转换为Mono对象流,传递给调用方。
结果处理是非常重要的功能,这里分类讲解:

2.5.1 onStatus

onStatus:提取当前响应的状态,做对应的处理,
HTTP响应状态码:1xx/2xx/3xx/4xx/5xx,
当响应状态异常,如出现4xx和5xx时,可直接做出合适的处理,
如抛出异常,返回自定义的响应信息。
在这里插入图片描述
onStatus中通过onRawStatus处理状态码,这个可以在DefaultWebClient中查看。
在这里插入图片描述

默认实现DefaultWebClient的onStatus实现源码如下,
由源码可知,通过onRawStatus处理。
在这里插入图片描述

2.5.2 bodyToMono

HTTP响应码正常时,通过bodyToMono将响应结果处理为自定义的目标类型,使用Mono包装,
不过,接口之间的响应约定,一般是接口提供方先定好,调用者兼容该约定,
如果是公司内部,则可以按照统一的约定来设计。
bodyToMono将结果映射到约定的类型后,以Mono形式传递。
在这里插入图片描述

2.5.3 bodyToFlux

和bodyToMono功能一样,不同的是响应结果使用Flux包装起来。
在这里插入图片描述

2.5.4 toEntity

将响应实体使用ResponseEntity进行映射,使用Mono包装。
由响应类型可知:Mono<ResponseEntity<T>>
在这里插入图片描述

2.5.5 toEntityList

与toEntity功能一样,不同的是将响应结果处理为List格式。
在这里插入图片描述

2.5.6 toEntityFlux

这个就不多解释了,toEntityMono一样。

在这里插入图片描述
到这里将响应结果处理方式简单过了一遍,
通过以上的知识,我们就可以使用WebClient请求接口,并合适地处理接口响应结果。

3 小结

(1)WebClient请求接口过程:创建实例->请求方法->请求URI->请求体->结果解析;
(2)接口传递参数使用:contentType,contentLength方法配置请求头;body、bodyValue方法配置请求体;
(3)接口响应结果提取使用:retrieve()方法;
(4)接口响应状态判断使用:onStatus()方法;
(5)接口响应结果处理方法有:bodyToMoon/bodyToFlux/toEntity/toEntityFlux;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/654249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

03单链表及代码实现

链表介绍&#xff08;Linked List&#xff09; 链表是有序列表&#xff0c;存储方式如下图&#xff08;物理结构图&#xff09; 链表小结 链表是以结点的方式来存储的。链式存储。每个结点包含data域、next域&#xff08;指向下一个结点&#xff09;。要注意的是&#xff0…

阿里云服务器适用于哪些业务场景?有哪些行业的客户在使用?

阿里云服务器适用于哪些业务场景&#xff1f;有哪些行业的客户在使用&#xff1f;    阿里云服务器的主要业务场景   阿里云服务器能够满足各种业务场景的需求&#xff0c;具有高性能、易扩展、安全可靠等特点。下面我们将详细介绍阿里云服务器适用于哪些业务场景。 Web应用…

JUC并发编程初学

什么是JUC进程和线程回顾Lock锁生产者和消费者8锁的线程集合类不安全CallableCountDownLatch、CyclicBarrier、Semaphore读写锁阻塞队列线程池四大函数式接口Stream流式计算分支合并异步回调JMMvolatile深入单例模式深入理解CAS原子引用可重入锁、公平锁非公平锁、自旋锁、死锁…

阿里云服务器的扩展性如何?是否支持弹性扩容和自动负载均衡?

阿里云服务器的扩展性如何&#xff1f;是否支持弹性扩容和自动负载均衡&#xff1f;   阿里云服务器的扩展性特点   阿里云服务器&#xff08;ECS&#xff09;在扩展性方面具有优势&#xff0c;能够满足用户不断变化的业务需求。以下我们将详细介绍阿里云服务器的扩展性特点…

离散数学题目收集整理练习(期末过关进度50%)

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;离散数学考前复习&#xff08;知识点题&#xff09; &#x1f353;专栏&#xff1a;概率论期末速成&#xff08;一套卷&#xff09; &#x1f433;专栏&#xff1a;数字电路考前复习 ✨博主的其他文章&#xff1a;点击…

Spring Security--连接数据库

书接上一篇&#xff0c;在实际的开发中&#xff0c;我们的账号密码不可能是这样写在配置文件中的&#xff0c;应该是要来自于数据库。 接着上一篇的项目&#xff0c;我们继续&#xff0c;在原有的依赖的基础上新增&#xff0c;mysql驱动依赖和mybatis依赖 <dependencies>…

拼多多和华为5年,分享一下我的划水经验....

先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;17 年毕业加入华为&#xff0c;之后跳槽到了滴滴&#xff0c;一直从事软件测试的工作。之前没有实习经历&#xff0c;算是5年的工作经验吧。 这5年之间完成了一次晋升&#xff0c;换了一家公司&#xff0c;有…

650V IGBT 模块(FAM65V05DF1)NTMFD5C470NLT1G和NTMTS0D7N04CTXG(40V)表面贴装 MOSFET

FAM65V05DF1智能电源模块&#xff08;IPM&#xff09;是高度集成的固态电源开关&#xff0c;在单个模块中集成了基于IGBT或MOSFET的栅极驱动电路。IPM还包括电源系统免受短路、欠压和极端温度等问题的保护。 该IPM具有高集成度、小封装和出色的冷却性能&#xff0c;有助于设计…

基于Java在线云音乐系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

大学英语六级考试2022年9月真题|第一 二 三 套|9:20

【作文1】It is now widely accepted that mutual trust and openness is the key to promoting cooperation. 【作文2】Today more and more people begin to realize the pleasures and joys of real-world social interaction. 【作文3】Nowadays students are becoming …

红外测距传感芯片WH4530A

红外线又称红外光&#xff0c;它具有反射、折射、散射、干涉、吸收等性质。任何物质&#xff0c;只要它本身具有一定的温度&#xff08;高于绝对零度&#xff09;&#xff0c;都能辐射红外线。红外线传感器测量时不与被测物体直接接触&#xff0c;因而不存在摩擦&#xff0c;并…

踏上极速向未来之旅!——2023年量化科技嘉年华·专场回顾

2023年6月2日—3日&#xff0c;“2023量化科技嘉年华”在上海世博中心召开&#xff0c;这场为期两天的量化科技盛会&#xff0c;多方位呈现了量化科技创新成果&#xff0c;吸引了众多关注。 在嘉年华的第二天&#xff0c;多场主题论坛同步进行。 由华锐技术主办的“极速向未来…

编程(42)----------锁策略

简单总结一下自身对于锁策略的理解. 首先锁策略并非只针对某一种编程语言, 不同的编辑语言都可以使用同一套锁策略. 常见的锁策略有: 乐观锁和悲观锁 乐观锁, 即认为锁的竞争并非非常激烈. 悲观锁反之. 换句话说, 假设期末来临. 乐观态度的学生认为复习的很好, 问题不大. 而…

Navicat 连接 MySQL :2002 - Can‘t connect to server on ‘127.0.0.1‘ (36)

问题&#xff1a; 2002 - Can‘t connect to server on ‘127.0.0.1‘ (36) 场景 Navicat 16MySQL 5.7Windows虚拟机Mac主机 导言&#xff1a; Navicat 是一款功能强大的数据库管理工具&#xff0c;但在使用过程中可能会遇到连接 MySQL 数据库时出现 “Can’t connect to se…

微服务开发系列 第十篇:Gateway

总概 A、技术栈 开发语言&#xff1a;Java 1.8数据库&#xff1a;MySQL、Redis、MongoDB、Elasticsearch微服务框架&#xff1a;Spring Cloud Alibaba微服务网关&#xff1a;Spring Cloud Gateway服务注册和配置中心&#xff1a;Nacos分布式事务&#xff1a;Seata链路追踪框架…

2023年餐饮连锁行业研究报告

第一章 行业概况 餐饮连锁行业是全球经济的重要组成部分&#xff0c;它的主要运营模式是通过连锁经营形式提供食品和饮料服务。 连锁经营主要分为三种运营模式&#xff1a;直营连锁、特许经营和自由连锁经营。三种模式通过专业分工、集中管理实现规模效益。 直营连锁&#x…

华为又开始放大招了?CV新架构:VanillaNet: the Power of Minimalism in Deep Learning 论文阅读笔记

华为又开始放大招了&#xff1f;CV新架构&#xff1a;VanillaNet: the Power of Minimalism in Deep Learning 论文阅读笔记 一、Abstract二、引言三、单个 Vanilla 的神经结构四、训练 VanillaNet4.1 深度训练策略4.2 Series Informed Activation Function 五、实验5.1 消融实…

SSD202D-logo显示调试

参考网址:cBOOT LOGO以及显示参数使用参考 - SigmaStarDocsSigmaStar Developer Documentationhttp://wx.comake.online/doc/doc/TAKOYAKI_ZH/customer/development/software/BOOTLOGO.html1.mipii点亮过程中需要加点复位 2.编译生成新屏参 3.修改屏参选择名字 4.

Cortex-M3 的 双堆栈MSP和PSP

什么是栈&#xff1f; 在谈M3堆栈之前我们先回忆一下数据结构中的栈。栈是一种先进后出的数据结构(类似于枪支的弹夹&#xff0c;先放入的子弹最后打出&#xff0c;后放入的子弹先打出)。M3内核的堆栈也不例外&#xff0c;也是先进后出的。栈的作用&#xff1f; …

性能测试基础知识(一)性能测试的分类

性能测试的分类 一、什么是性能测试&#xff1f;二、性能测试的目的三、性能测试的分类1、基准测试2、并发测试3、负载测试4、压力测试5、其他测试 一、什么是性能测试&#xff1f; 性能测试是在一定的负载1条件下&#xff0c;系统的响应时间等特性是否满足特定的性能需求。需…