当前位置: 首页 > news >正文

深入 Spring RestTemplate 源码:掌握 HTTP 通信核心技术

在上一篇文章《Spring Boot 项目高效 HTTP 通信:常用客户端大比拼!》里,我们提到了RestTemplate,它是Spring框架提供的Http客户端,在springboot项目开发过程中,属于使用最为广泛的 HTTP 客户端之一了。今天,我们就来深入探究一下 RestTemplate 的源码。

在 RestTemplate 处理 HTTP 请求的过程中,涉及到五个核心的方法

1. httpEntityCallback(Object requestBody, Type responseType):用于处理HTTP请求的回调,其中包含请求体和预期的响应类型。

2. responseEntityExtractor(Type responseType):用于根据给定的responseType从HTTP响应中提取数据

3. execute(String url, HttpMethod method, RequestCallback requestCallback, ResponseExtractor<T> responseExtractor, Object... uriVariables)方法

这个方法在 RestTemplate 的 HTTP 操作流程里扮演着核心的角色。

  • 作用

        它负责协调各个组件来执行一个完整的 HTTP 请求,并处理相应的响应。

  • 实现

        调用了doExecute()方法来执行实际的HTTP请求,其中包含请求方法(如GET、POST等)、请求回调、响应提取器等参数。这里的 doExecute () 方法就像是一个幕后的执行者,它接受请求方法、请求回调、响应提取器等重要参数。当 execute 方法将这些参数传递给 doExecute () 方法时,就启动了整个 HTTP 请求的执行流程。

        这一设计模式体现了分层和职责分离的思想,execute 方法作为对外的接口,负责接收和整理请求相关的参数,而 doExecute () 方法则专注于实际的请求执行操作。

4. doExecute(URI url, HttpMethod method, RequestCallback requestCallback, ResponseExtractor<T> responseExtractor)

下面是 doExecute 方法的具体实现代码:

    protected <T> T doExecute(URI url, HttpMethod method, RequestCallback requestCallback, ResponseExtractor<T> responseExtractor) throws RestClientException {Assert.notNull(url, "'url' must not be null");Assert.notNull(method, "'method' must not be null");ClientHttpResponse response = null;String resource;try {// 核心逻辑ClientHttpRequest request = this.createRequest(url, method);if (requestCallback != null) {requestCallback.doWithRequest(request);}// 核心方法,调用了executeInternal实现具体的处理逻辑。response = request.execute();this.handleResponse(url, method, response);if (responseExtractor != null) {Object var14 = responseExtractor.extractData(response);return var14;}resource = null;} catch (IOException var12) {resource = url.toString();String query = url.getRawQuery();resource = query != null ? resource.substring(0, resource.indexOf(63)) : resource;throw new ResourceAccessException("I/O error on " + method.name() + " request for \"" + resource + "\": " + var12.getMessage(), var12);} finally {if (response != null) {response.close();}}return resource;}

在这个方法中,调用了createRequest(URI url, HttpMethod method)创建符合特定要求的请求对象,然后通过该对象的execute方法执行请求,实际的执行逻辑委托给了executeInternal方法。

5. executeInternal(final HttpHeaders headers)

  executeInternal 方法在整个 RestTemplate 的 HTTP 请求执行流程里属于非常底层的操作。

protected ListenableFuture<ClientHttpResponse> executeInternal(final HttpHeaders headers) throws IOException {final SettableListenableFuture<ClientHttpResponse> responseFuture = new SettableListenableFuture();ChannelFutureListener connectionListener = new ChannelFutureListener() {public void operationComplete(ChannelFuture future) throws Exception {if (future.isSuccess()) {Channel channel = future.channel();channel.pipeline().addLast(new ChannelHandler[]{new RequestExecuteHandler(responseFuture)});FullHttpRequest nettyRequest = Netty4ClientHttpRequest.this.createFullHttpRequest(headers);channel.writeAndFlush(nettyRequest);} else {responseFuture.setException(future.cause());}}};// netty启动器this.bootstrap.connect(this.uri.getHost(), getPort(this.uri)).addListener(connectionListener);return responseFuture;}
  • 作用:负责将相关请求信息转换为适合底层网络通信框架(Netty)的操作,并处理网络连接和请求发送的具体细节。
  • 实现:通过Netty异步发起HTTP请求,连接成功后添加请求处理器,并发送请求,最后,将响应结果或者异常设置到 responseFuture 中,然后返回该 responseFuture。

通过对 RestTemplate 源码的剖析,我们可以清晰地看到 RestTemplate 在处理 HTTP 请求时的内部工作机制,其实就是基于 Netty 来实现 HTTP 请求的

这种基于 Netty 的实现方式为 Spring Boot 项目中的 HTTP 通信提供了一种高效、稳定的解决方案,并且通过 RestTemplate 提供的一系列方法,开发人员能够方便地在项目中进行 HTTP 请求的发送和响应的处理。

这不仅体现了 Spring 框架在设计上的分层架构思想,也展示了如何利用成熟的网络通信框架( Netty)来构建强大的 HTTP 客户端功能, 避免重复造轮子

相关文章:

深入 Spring RestTemplate 源码:掌握 HTTP 通信核心技术

在上一篇文章《Spring Boot 项目高效 HTTP 通信&#xff1a;常用客户端大比拼&#xff01;》里&#xff0c;我们提到了RestTemplate&#xff0c;它是Spring框架提供的Http客户端&#xff0c;在springboot项目开发过程中&#xff0c;属于使用最为广泛的 HTTP 客户端之一了。今天…...

计算机网络:计算机网络概述 —— 初识计算机网络

文章目录 计算机网络组成部分网络架构协议与标准网络设备网络类型作用实际应用案例 计算机网络 计算机网络是指将多台计算机通过通信设备和通信链路连接起来&#xff0c;以实现数据和信息的交换和共享的技术和系统。它是现代信息社会的基础设施之一&#xff0c;也是互联网的基…...

set和map结构的使用

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;游戏、数据结构、c语言基础、c学习、算法 目录 一、序列式容器和关联式容器 二、set和multiset 1.insert 2.erase 3.find 4.count 三、map和mapmulti 1.pair 2.insert 3.find 4.operator[ ] 5.erase 6.lo…...

2. qt_c++反射实例

目录 使用场景元对象相关类及宏常用功能获取类相关内容以及委托调用 使用场景 Qt基于强大的元对象系统实现反射机制&#xff1b; 在复杂的开发需求中&#xff0c;我们希望通过一些手段映射出我们的类&#xff08;映射对象&#xff09; 然后直接使用&#xff0c;通过&#xff0…...

卷积神经网络(CNN)的计算量和参数怎么准确估计?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 1. 卷积层&#xff08;Convolutional Layer&#xff09; a) 计算量估计&#xff1a; 卷积层的 FLOPs 2 * H_out * W_out * C_in * C_out * K_h * K_w 详细解释&#xff1a; H_out, W_out&#xff…...

Ruby基础语法

Ruby 是一种动态、反射和面向对象的编程语言&#xff0c;它以其简洁的语法和强大的功能而受到许多开发者的喜爱。以下是 Ruby 语言的一些基本语法&#xff1a; 1. 打印输出 puts "Hello, Ruby!" 变量赋值 x 10 name "John" 2. 数据类型 Ruby 有多种…...

插入排序C++

题目&#xff1a; 样例解释&#xff1a; 【样例解释 #1】 在修改操作之前&#xff0c;假设 H 老师进行了一次插入排序&#xff0c;则原序列的三个元素在排序结束后所处的位置分别是 3,2,1。 在修改操作之后&#xff0c;假设 H 老师进行了一次插入排序&#xff0c;则原序列的三个…...

修改ID不能用关键字作为ID校验器-elementPlus

1、校验器方法 - forbiddenCharValidator const idUpdateFormRef ref(null); const forbiddenCharValidator (rule, value, callback) > {const forbiddenCharacters [as,for,default,in,join,left,inner,right,where,when,case,select];for (let forbiddenCharacter o…...

一文详解WebRTC、RTSP、RTMP、SRT

背景 好多开发者&#xff0c;希望对WebRTC、RTSP、RTMP、SRT有个初步的了解&#xff0c;知道什么场景该做怎样的方案选择&#xff0c;本文就四者区别做个大概的介绍。 WebRTC 提到WebRTC&#xff0c;相信好多开发者第一件事想到的就是低延迟&#xff0c;WebRTC&#xff08;W…...

全国职业院校技能大赛(大数据赛项)-平台搭建Zookeeper笔记

ZooKeeper是一个分布式的、开放源码的分布式应用程序协调服务&#xff0c;为分布式应用提供一致性服务。它的设计目标是简化分布式系统的管理&#xff0c;保证多个节点之间的数据一致性和协调工作。ZooKeeper提供了类似文件系统的层次化命名空间&#xff0c;用来存储和管理元数…...

不同领域神经网络一般选择什么模型作为baseline(基准模型)

在神经网络研究中&#xff0c;选择合适的baseline&#xff08;基线模型&#xff09;是评估新方法有效性的重要步骤。基线模型通常是领域内公认的、性能良好的参考模型&#xff0c;用于比较和验证新提出模型的优势。以下是一些在不同任务和领域中常见的基线模型选择&#xff1a;…...

华为-IPv6与IPv4网络互通的6to4自动隧道配置实验

IPv4向IPv6的过渡不是一次性的,而是逐步地分层次地。在过渡时期,为了保证IPv4和IPv6能够共存、互通,人们发明了一些IPv4/IPv6的互通技术。 本实验以6to4技术为例,阐述如何配置IPv6过渡技术。 配置参考 R1 # sysname R1 # ipv6# interface GigabitEthernet0/0/1ip address 200…...

【spring中event】事件简单使用

定义事件类 /* * 1. 定义事件类 * 首先&#xff0c;我们创建一个自定义事件 UserRegisteredEvent&#xff0c;用于表示用户注册事件。 * */ public class UserRegisteredEvent extends ApplicationEvent {private final String email;public UserRegisteredEvent(Object sourc…...

leetcode每日一题day19(24.9.29)——买票需要的时间

思路&#xff1a;在最开始的情况下每人需要买的票数减一是能保持相对位置不变的&#xff0c; 如果再想减一就有可能 有某些人只买一张票&#xff0c;而离开了队伍&#xff0c; 所有容易想到对于某个人如果比当前的人买的多就按当前的人数量算 因为在一次次减一的情况下&#xf…...

智源研究院推出全球首个中文大模型辩论平台FlagEval Debate

近日&#xff0c;智源研究院推出全球首个中文大模型辩论平台FlagEval Debate&#xff0c;旨在通过引入模型辩论这一竞争机制对大语言模型能力评估提供新的度量标尺。该平台是智源模型对战评测服务FlagEval大模型角斗场的延展&#xff0c;将有助于甄别大语言模型的能力差异。 F…...

python实用脚本(二):删除xml标签下的指定类别

介绍 在目标检测中&#xff0c;有些时候会遇到标注好的类别不想要了的情况&#xff0c;这时我们可以运行下面的代码来批量删除不需要的类别节省时间。 代码实现&#xff1a; import argparseimport xml.etree.ElementTree as ET import osclasses [thin_smoke]def GetImgNam…...

vue3 父子组件调用

vue3 父子组件调用 父组件调用子组件方法 子组件使用defineExpose将方法抛出 父组件定义 function&#xff0c;子组件通过 defineExpose 暴露方法&#xff0c;父组件通过 ref 获取子组件实例&#xff0c;然后通过 ref 获取子组件方法。 // 父组件 <template><div>…...

线性模型到神经网络

&#x1f680; 在初始神经网络那一节&#xff08;链接如下&#xff1a;初始神经网络&#xff09;的最后&#xff0c;我们通过加大考虑的天数使得我们最后得到的模型Loss最终停留在了0.32k&#xff0c;当我们在想让模型更加准确的时候&#xff0c;是做不到的&#xff0c;因为我们…...

【架构】前台、中台、后台

文章目录 前台、中台、后台1. 前台&#xff08;Frontend&#xff09;特点&#xff1a;技术栈&#xff1a; 2. 中台&#xff08;Middleware&#xff09;特点&#xff1a;技术栈&#xff1a; 3. 后台&#xff08;Backend&#xff09;特点&#xff1a;技术栈&#xff1a; 示例场景…...

Stable Diffusion 蒙版:填充、原图、潜空间噪声(潜变量噪声)、潜空间数值零(潜变量数值零)

在Stable Diffusion中&#xff0c;蒙版是一个重要工具&#xff0c;它允许用户对图像的特定部分进行编辑或重绘。关于蒙版蒙住的内容处理选项&#xff0c;包括填充、原图、潜空间噪声&#xff08;潜变量噪声&#xff09;、浅空间数值零&#xff08;潜变量数值零&#xff09;&…...

储能出海架构重构:摒弃传统x86工控机,基于ARM边缘节点的EMS策略下沉实战

摘要&#xff1a; 随着储能系统在全球范围的大规模部署&#xff0c;出海项目的硬件BOM成本压力与恶劣环境下的维护成本日益凸显。传统的“x86工控机下发控制 透传网关上传数据”的双体架构显得极度臃肿且易引发单点故障。本文从底层研发架构师视角出发&#xff0c;深度拆解符合…...

5分钟掌握ViGEmBus:Windows游戏控制器模拟终极指南

5分钟掌握ViGEmBus&#xff1a;Windows游戏控制器模拟终极指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus ViGEmBus是一款强大的Windows内核级驱动程序&…...

5G与4G LTE互操作:无缝衔接,共筑通信新生态

5G与4G LTE互操作&#xff1a;无缝衔接&#xff0c;共筑通信新生态 在移动通信技术日新月异的今天&#xff0c;5G作为新一代通信技术&#xff0c;正逐步融入我们的生活&#xff0c;与4G LTE形成互补共存的局面。5G与4G LTE之间的互操作&#xff0c;不仅关乎用户体验的连续性&am…...

基于WebAssembly的高效SQLite数据库在线解析方案

基于WebAssembly的高效SQLite数据库在线解析方案 【免费下载链接】sqlite-viewer View SQLite file online 项目地址: https://gitcode.com/gh_mirrors/sq/sqlite-viewer SQLite Viewer是一款采用纯前端技术的SQLite数据库在线查看工具&#xff0c;通过WebAssembly技术实…...

DeepSeek V4的突破:探索未来AI意识的可能性

引言 DeepSeek V4的发布&#xff0c;再次刷新了人们对大语言模型的认知&#xff1a;更强的代码生成、更复杂的逻辑推理、更精准的长文本理解……几乎所有技术评测都在告诉我们&#xff1a;AI又向前迈进了一大步。社交媒体上&#xff0c;关于“AI是否快要拥有意识”的讨论也随之…...

ANSYS Maxwell 静电仿真避坑指南:模型设置、求解失败与结果解读的5个常见问题

ANSYS Maxwell 静电仿真避坑指南&#xff1a;模型设置、求解失败与结果解读的5个常见问题 当你第一次成功运行ANSYS Maxwell的静电仿真时&#xff0c;那种成就感是真实的。但很快你会发现&#xff0c;能跑通仿真和得到可信结果之间&#xff0c;隔着无数个深夜调试的坑。这篇文章…...

给Windows桌面注入macOS灵魂:鼠标指针美化的艺术之旅

给Windows桌面注入macOS灵魂&#xff1a;鼠标指针美化的艺术之旅 【免费下载链接】macOS-cursors-for-Windows Tested in Windows 10 & 11, 4K (125%, 150%, 200%). With 2 versions, 2 types and 3 different sizes! 项目地址: https://gitcode.com/gh_mirrors/ma/macOS…...

OpenClaw工作空间管理工具:自动化文件治理与优化实践

1. 项目概述&#xff1a;一个专为OpenClaw设计的本地化工作空间管理工具如果你和我一样&#xff0c;深度使用过OpenClaw这套开源AI智能体框架&#xff0c;那你一定对那几个核心的Markdown配置文件又爱又恨。AGENTS.md里定义着你的数字员工&#xff0c;SOUL.md是它们的“灵魂”与…...

Hermes模型优化实战:量化、剪枝与蒸馏技术全解析

1. 项目概述&#xff1a;一个为Hermes模型量身定制的“武士刀”如果你最近在关注大语言模型&#xff08;LLM&#xff09;的微调领域&#xff0c;特别是那些追求极致推理速度和响应效率的模型&#xff0c;那么“Hermes”这个名字你一定不陌生。它通常指代一系列基于Llama、Mistr…...

ARM TLB指令RVAE1IS解析与性能优化实践

1. ARM TLB指令深度解析&#xff1a;从原理到实战在ARM架构的虚拟内存系统中&#xff0c;TLB&#xff08;Translation Lookaside Buffer&#xff09;作为地址转换的缓存机制&#xff0c;对系统性能有着决定性影响。当页表内容发生变化时&#xff0c;如何高效、精确地维护TLB一致…...