RestTemplate-源码阅读

news2024/11/23 13:13:00

参考资料:https://github.com/mercyblitz/java-training-camp/blob/main/stage-1/docs/04.%20%E7%AC%AC%E5%9B%9B%E8%8A%82%EF%BC%9AREST%20API%20%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%AE%BE%E8%AE%A1.md

RestTemplate 源码阅读

GET POST EXCHANGE

在这里插入图片描述
在这里插入图片描述
我们可以看到其实没有什么本质的区别,只是在创建CallBack的时候会有一点区别。另外还有exchange:
在这里插入图片描述

三者有何区别?
  • 请求类型:GET 和 POST 分别针对特定的 HTTP 方法,而 EXCHANGE 方法则可以用于任何 HTTP 方法。
  • 请求体:GET 方法不支持请求体,而 POST 和 EXCHANGE 方法支持请求体。
  • 灵活性:EXCHANGE 方法提供了最大的灵活性,允许你自定义请求的构建过程,包括设置请求头、请求体等。
  • 返回类型:这三个方法都返回 ResponseEntity,包含了响应的状态码、响应头和响应体

请求执行流程 以GET为例

1 创建回调函数
在这里插入图片描述
我们可以看到有两种回调函数,都是RestTemplate的内部类。而且HttpEntityRequestCallback继承了AcceptHeaderRequestCallback。可以看到HttpEntityRequestCallback多了可以携带Body的HttpEntity。然后里面的核心方法是doWithRequest:

  • 设置请求头:例如设置 Content-Type、Authorization 等。
  • 设置请求体:例如设置 POST 请求的请求体。
  • 执行其他预处理逻辑:例如日志记录、性能监控等。
    在这里插入图片描述

2 核心API用来进行数据提取

HttpMessageConverterExtractor<T> responseExtractor =
				new HttpMessageConverterExtractor<>(responseType, getMessageConverters(), logger);

也许你会看到exchange中ResponseEntityResponseExtractor:
在这里插入图片描述
但其实内部也是委托给HttpMessageConverterExtractor。我们可以看到有这样几种Converter。

在这里插入图片描述
至于如何选择Converters是通过下面这个方法,canWrite 是发送请求的时候些Body,canRead是调用结束以后读取Body。

在这里插入图片描述
在这里插入图片描述
然后就是执行调用了:
在这里插入图片描述
调用执行完毕以后处理返回结果,可以看到如果有错误就会使用ResponseErrorHandler 进行错误处理:
在这里插入图片描述

// 如果没有设置错误处理器则有默认的
private ResponseErrorHandler errorHandler = new DefaultResponseErrorHandler();

如果没有错误就是提取结果了,同样的还是HttpMessageConverter。

底层实现

我们可以看到可以指定ClientHttpRequestFactory

public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
   RestTemplate restTemplate = new RestTemplate(factory);
   return restTemplate;
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
   SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
   factory.setReadTimeout(5000);
   factory.setConnectTimeout(15000);
   return factory;
}

有下面三种实现:

  • JDK HttpURLConnection - SimpleClientHttpRequestFactory(默认)
  • Apache HttpComponents HttpClient - HttpComponentsClientHttpRequestFactory
  • OkHttp3 - OkHttp3ClientHttpRequestFactory

拓展 InterceptingClientHttpRequestFactory

这个工工厂提供了我们自定义拦截器进行处理的能力,这里可以进行一些自定义的拓展。就比如我们可以在调用之前自定义一个拦截器进行参数校验,又或者进行服务与请求与重试。
这个类其实就是ClientHttpRequestFactory 的一个包装类,怎么实现拦截的呢?我们来看看,其实一眼就能看到,核心的逻辑都是委托给ClientHttpRequestFactory来实现的。
在这里插入图片描述

我们看到上面拦截器的逻辑,实际上这里是一个递归调用然后回溯的过程:
在这里插入图片描述

性能优化

序列化/反序列化优化(其实就是把converter的效率来进行提高)
基于 HttpMessageConverter 优化:

  • 底层优化,比如使用 FastJSON 或者其他实现
  • 减少 REST POJO 对象反序列化选项,比如设定一个或两个 HttpMessageConverter 实现,FastJsonHttpMessageConverter

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

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

相关文章

web前端之vue+element+select实现多选、两个数组排序、保持源数据、查找索引、过滤、克隆、复制、findIndex、filter

MENU 前言效果图templatestyleJavaScript 前言 1、代码段是一个Vue组件的模板、脚本和样式的完整实现。它结合element的一些组件(如el-select和el-radio-group)&#xff0c;实现一个带有下拉选择、多选功能以及可选择“是/否”状态的组件。 2、组件实现一个复杂的选择和管理界面…

Redis之使用Java代码操作Redis

目录 配置Redis远程访问 安装Redis桌面管理工具 Java操作Redis 创建maven工程 案例演示 连接redis String字符串 Hash哈希 List列表 Set集合 Zset有序集合 配置Redis远程访问 修改访问IP地址 #跳转到redis安装目录 cd /usr/local/redis-6.2.1 #修改redis.con…

SOL项目开发代币DApp的基本要求、模式创建与海外宣发策略

Solana&#xff08;SOL&#xff09;作为一个高性能区块链平台&#xff0c;以其快速的交易速度和低交易成本吸引了大量开发者和投资者。基于Solana开发的去中心化应用程序&#xff08;DApp&#xff09;和代币项目正逐步成为区块链领域的重要组成部分。要成功开发并推广一个SOL项…

通过FHIR和EPIC进行对接

说明 Epic是全美最大电子病历供应商。 FHIR (Fast Health Interoperability Resources)旨在实现医疗健康信息的交换。其中包括了临床数据和健康相关的行政管理数据、公共卫生和临床研究数据。既包括了人类和兽医&#xff0c;又适合大多数应用场景——住院、慢病管理、社区护理…

windows平台的postgresql主从数据库流备份

主: 操作系统:windows10 数据库版本&#xff1a;postgresql-16.2 ip&#xff1a;192.168.3.254 从: 操作系统&#xff1a;windows10 数据库版本&#xff1a;postgresql-16.2 ip&#xff1a;192.168.3.253 配置主库 配置 pg_hba.conf 文件 在 pg 的安装目录下&#xff0c;找到 …

算法_字符串专题---持续更新

文章目录 前言最长公共前缀题目要求题目解析代码如下 最长回文子串题目要求题目解析代码如下 二进制求和题目要求题目解析 字符串相乘题目要求题目解析代码如下 前言 本文将会向你介绍有关字符串的相关题目&#xff1a;最长公共前缀、最长回文子串、二进制求和、字符串相乘。本…

CISAW安全集成和别的类型有什么区别

信息安全人员认证&#xff08;Certified Information Security Assurance Worker, CISAW&#xff09;是由中国网络安全审查技术认证中心依据信息安全领域的不同专业、技术和应用方向以及安全岗位需求&#xff0c;按照ISO/IEC 17024标准建立的多层次认证体系。 CISAW分为三个主…

web前端之选项卡的实现、动态添加类名、动态移除类名、动态添加样式、激活、tabBar

MENU 原生vue 原生 效果图 html 代码 <div class"card"><div class"tab_bar"><div class"item" onclick"handleTabBar(this)">tabBar1</div><div class"item" onclick"handleTabBar(this…

哈佛大学年中回顾2024年ESG发展近况

--- 兼谈新能源企业出海之ESG营销战略 2024年上半年&#xff0c;环境、社会和治理&#xff08;ESG&#xff09;问题以及对方法的不同意见继续成为全球头条新闻。今年年初&#xff0c;公司及其利益相关者在ESG的支持者和批评者之间进行了权衡&#xff0c;虽然近几个月ESG的势头…

cesium添加弹窗,跟随实体移动

先看效果&#xff0c;弹窗会跟随实体移动 1、首先我们先写一个弹窗样式&#xff0c;如果是vue开发&#xff0c;css最好写到公共引入的css &#xff0c;组件内css会编译后会加hash值 2、然后我们 开启 cesium的监听事件&#xff0c; 注意的是 initBubbleWindow方法在地球加载后…

控制阶段在DMAIC中的主要目标是什么?

在探讨DMAIC&#xff08;定义Define、测量Measure、分析Analyze、改进Improve、控制Control&#xff09;这一持续改进流程时&#xff0c;控制阶段作为整个循环的尾声&#xff0c;其重要性不言而喻。控制阶段的主要目标不仅在于巩固前期努力所取得的成果&#xff0c;更在于确保这…

EXCEL 分段排序--Excel难题#86

Excel某表格有3列。 ABC1A1B1512A2B27213A3B33824A4B495A5B5736A6B65777A7B7918A13B131509A14B144910A17B1770211A18B1870512A34B343313A35B3540914A36B3657915A37B3710 现在要求对表格按照第3列进行分段排序&#xff0c;由小到大排列。第1段&#xff1a;第3列小于等于50&…

UE5 datetime 创建日期时间节点 进行加法减法。个人理解

以下均为个人实验和个人理解&#xff0c;仅供参考。 目录 目标节点&#xff1a; 年月日 时分秒毫秒 目标节点&#xff1a; 年月日 年月日以1 为基底。若填的数字<0&#xff0c;该节点会失效。 试验&#xff1a; year基底为1&#xff0c;正常 year基底为0&#xff0c;异…

主流AI绘画工具StableDiffusion最新模型sd3本地部署方法(附工作流)

前言/introduction Stable Diffusion 3&#xff08;简称SD3&#xff09;是Stability AI最新推出的文本到图像生成模型。相比前代模型&#xff0c;SD3在生成质量、细节表现以及运行效率上有了显著提升&#xff0c;尤其在细腻的图像渲染和复杂的场景构建方面表现出色。SD3模型提…

【Harmony OS 4.0】页面路由跳转代码示例

ets/pages/Index.ets import router from ohos.router;Entry Component struct Index {State title: string Index Page;State message: string onPageShow(): void { // 页面每次显示时触发。使用aboutToAppear页面没反应。let record router.getParams() as Record<st…

微服务多个模块启动,端口被占用,yml配置文件读不到

刚刚提交到gitee自己的仓库&#xff0c;拉下来还是报错&#xff0c;然后看到一个解决方法&#xff1a; <build><resources><resource><directory>src/main/java</directory><includes><include>**/*.yml</include><includ…

医院信息管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

神经重建在自动驾驶模拟中的应用

验证自动驾驶软件需要数百万公里的测试。这不仅意味着系统开发周期长&#xff0c;而且系统的复杂度也会不断增加&#xff0c;同时&#xff0c;大规模的实车测试也会耗费巨量的资源并且可能会面临未知的安全问题。aiSim这样的虚拟仿真工具可以减轻真实世界测试的负担。 AD和ADA…

学习ComfyUI的一个不错网站:www.comflowy.com/basics

学习ComfyUI&#xff0c;不仅仅是照搬别人的工作流来使用&#xff0c;重要的是能自己搭建工作流&#xff0c;而要能够熟练搭建&#xff0c;离不开对工作流中节点&#xff08;特别是重要节点&#xff09;的透彻理解。比如我自己&#xff0c;原来对 Lora 就十分陌生&#xff0c;不…

一款好看的WordPress REST API 主题

介绍&#xff1a; 主题特色&#xff1a; 使用Nuxtjs WordPress Rest Api 实现前后端分离&#xff0c;可完成多端部署&#xff1b; 主题支持自动切换黑夜模式。 使用说明&#xff1a; service 目录为wordpress主题文件&#xff0c;需要拷贝到wordpress主题目录下&#xff0…