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

这篇具有很好参考价值的文章主要介绍了响应式编程理论篇:源码浅析WebClient。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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
响应式编程理论篇:源码浅析WebClient

源码位置: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->请求体->结果解析。

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

2.1 构建实例

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

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

响应式编程理论篇:源码浅析WebClient
构建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方法。
方法列表:
响应式编程理论篇:源码浅析WebClient
接口方法:org.springframework.web.reactive.function.client.WebClient
响应式编程理论篇:源码浅析WebClient
具体的实现在实现类:
org.springframework.web.reactive.function.client.DefaultWebClient
到这,细节可各位读者深究。
响应式编程理论篇:源码浅析WebClient

2.3 配置URI

实例化WebClient,确定请求方法后,接下来需要配置实际请求接口的URI。
方法列表:
响应式编程理论篇:源码浅析WebClient
接口类:org.springframework.web.reactive.function.client.WebClient.UriSpec
响应式编程理论篇:源码浅析WebClient

默认实现类:
org.springframework.web.reactive.function.client.DefaultWebClient.DefaultRequestBodyUriSpec
具体源码如下:
响应式编程理论篇:源码浅析WebClient

2.4 发送请求参数

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

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

其中,body既可以填充请求体,又可以填充表单数据,或为文件数据。
响应式编程理论篇:源码浅析WebClient
RequestBodySpec接口:
org.springframework.web.reactive.function.client.WebClient.RequestBodySpec
响应式编程理论篇:源码浅析WebClient

默认实现:
org.springframework.web.reactive.function.client.DefaultWebClient.DefaultRequestBodyUriSpec
响应式编程理论篇:源码浅析WebClient

2.5 提取响应结果:retrieve()

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

序号 状态码 描述
1 1xx 响应信息
2 2xx 成功响应
3 3xx 重定向
4 4xx 客户端响应异常
5 5xx 服务端响应异常

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

2.5.1 onStatus

onStatus:提取当前响应的状态,做对应的处理,
HTTP响应状态码:1xx/2xx/3xx/4xx/5xx,
当响应状态异常,如出现4xx和5xx时,可直接做出合适的处理,
如抛出异常,返回自定义的响应信息。
响应式编程理论篇:源码浅析WebClient
onStatus中通过onRawStatus处理状态码,这个可以在DefaultWebClient中查看。
响应式编程理论篇:源码浅析WebClient

默认实现DefaultWebClient的onStatus实现源码如下,
由源码可知,通过onRawStatus处理。
响应式编程理论篇:源码浅析WebClient

2.5.2 bodyToMono

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

2.5.3 bodyToFlux

和bodyToMono功能一样,不同的是响应结果使用Flux包装起来。
响应式编程理论篇:源码浅析WebClient

2.5.4 toEntity

将响应实体使用ResponseEntity进行映射,使用Mono包装。
由响应类型可知:Mono<ResponseEntity<T>>
响应式编程理论篇:源码浅析WebClient

2.5.5 toEntityList

与toEntity功能一样,不同的是将响应结果处理为List格式。
响应式编程理论篇:源码浅析WebClient

2.5.6 toEntityFlux

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

响应式编程理论篇:源码浅析WebClient
到这里将响应结果处理方式简单过了一遍,
通过以上的知识,我们就可以使用WebClient请求接口,并合适地处理接口响应结果。

3 小结

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

到了这里,关于响应式编程理论篇:源码浅析WebClient的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微服务系列-使用WebFlux的WebClient进行Spring Boot 微服务通信示例

    公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。 在之前的教程中,我们看到了使用 RestTemplate 的 Spring Boot 微服务通信示例。 从 5.0 开始,RestTemplate处于维护模式,很快就会被弃用。因此 Spring 团队建议使用 org.springframework.web.reactive.clien

    2024年02月05日
    浏览(50)
  • Spring 赌上未来一击,推出响应式框架 WebFlux,代码更优雅,性能更强!

    spring-webflux是spring在5.0版本后提供的一套响应式编程风格的web开发框架,大量测评证明,使用WebFlux开发接口能够大幅提升接口的吞吐量。 这个框架包含了spring-framework和spring mvc,它可以运行在Netty、Undertow以及3.1版本以上的Serlvet容器上。你可以在项目中同时使用spring-webmvc和

    2024年02月11日
    浏览(34)
  • 弹性地基梁matlab有限元编程 | 双排桩支护结构 | Matlab源码 | 理论文本

    作者简介:工学博士,高级工程师,专注于工业软件算法研究 本文已收录于专栏: 《 有限元编程从入门到精通 》本专栏旨在提供 1.以 案例 的形式讲解各类有限元问题的程序实现,并提供所有案例 完整源码 ;2. 单元类型 包含:杆单元,梁单元,平面三角形单元,薄板单元

    2024年03月11日
    浏览(48)
  • VUE3浅析---响应式

    VUE3中setup语法糖解决响应式的方案,所有的只要被ref或者reactive包裹的变量,都会转变成响应式。而在VUE2中,要想做成响应式,必须将变量定义在data函数中。 以下代码定义了三个User对象,并且都是使用ref做成了响应式,当点击按钮改变User对象的值的时候,页面上的值也会被

    2024年02月08日
    浏览(33)
  • 三维铁木辛柯梁Matlab有限元编程 | 弹簧支座 | 弹性支撑单元| Matlab源码 | 理论文本 | 三维梁 | 3D梁 | 空间梁

    作者简介:工学博士,高级工程师,专注于工业软件算法研究 本文已收录于专栏: 《 有限元编程从入门到精通 》本专栏旨在提供 1.以 案例 的形式讲解各类有限元问题的程序实现,并提供所有案例 完整源码 ;2. 单元类型 包含:杆单元,梁单元,平面三角形单元,薄板单元

    2024年03月25日
    浏览(50)
  • ECS与DOP(面向数据编程)浅析

    以下内容大部分是文字读起来确实会有点繁琐,内容主要是个人对ECS以及DOP的一些理解,如有错误欢迎指出,我觉得如果你正在学习ECS以及DOP,好好地读一下这篇文章是能够给你带来收获的。 DOP(data-oriented programming),也就是面向数据编程,一种编程范式。与面向对象以及面向

    2024年02月01日
    浏览(31)
  • 《Odoo开发者模式必知必会》—— 缘起

            Odoo作为业界优秀的开源商务软件,在全球范围内拥有广泛的使用者。在领英国际,可以搜索到全球很多国家都有大量odoo人才需求的招聘信息。在国内,虽然已经有为数不少的企业,他们或者已经使用odoo,或者正在了解odoo,但坦率地说,odoo在我们国内的普及程度

    2024年02月14日
    浏览(36)
  • OkHttp 源码浅析二

    OkHttp 配置参数: dispatcher 用于线程调度 connectionPool 连接池  64 个or 5 host 可以提升复用性 方便管理和提升性能 interceptors  networkInterceptors eventListenerFactory 事件监听器 连接建立 发送head body 等 retryOnConnectionFailure 连接 / 请求 失败是否重置 authenticator 自动认证修正 比如

    2024年02月12日
    浏览(42)
  • 【基于netty+zookeeper的rpc远程调用框架】首篇——缘起

    🐼 作者简介:一名大三在校生🎋 空有想法,没有实践 缘起 作为一名即将步入社会的大三学生,我深知一份优秀的简历对于求职的重要性。暑期实习作为大学生涯中的一个重要节点,不仅是锻炼自己、积累经验的宝贵机会,更是向未来雇主展示自己能力和潜力的关键时期。

    2024年04月26日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包