restTemplate源码解析(二)restTemplate的核心逻辑
所有文章
https://www.cnblogs.com/lay2017/p/11740855.html
正文
上一篇文章中,我们构造了一个RestTemplate的Bean实例对象。本文将主要了解一下RestTemplate执行请求的核心逻辑。
先写一个简单的get请求示例代码
@Autowired
private RestTemplate restTemplate; public String getData() {
return restTemplate.getForEntity("http://www.baidu.com", String.class).getBody();
}
示例代码通过restTemplate的getForEntity方法发出请求,并返回一个ResponseEntity,getBody方法从ResponseEntity中获取响应体。
getForEntity方法是RestOperations接口定义的,RestTemplate做了相应的实现。让我们打开RestOperations看看该接口的定义
/**
* get请求
* @param url 请求的urL地址
* @param responseType 响应对象的类型
* @param uriVariables uri变量
* @return 响应体
**/
<T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables) throws RestClientException;
该接口简单的定义了访问什么资源,响应的是什么类型的数据
再跟进RestTemplate实现类,看看getForEntity的具体实现
@Override
public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables) throws RestClientException {
// 请求回调
RequestCallback requestCallback = acceptHeaderRequestCallback(responseType);
// 响应体抽取
ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType);
// 核心执行逻辑
return nonNull(execute(url, HttpMethod.GET, requestCallback, responseExtractor, uriVariables));
}
可以看到,execute里包含了核心的执行逻辑。跟进该方法
public <T> T execute(String url, HttpMethod method, @Nullable RequestCallback requestCallback, @Nullable ResponseExtractor<T> responseExtractor, Object... uriVariables) throws RestClientException {
// uri处理
URI expanded = getUriTemplateHandler().expand(url, uriVariables);
// 核心逻辑
return doExecute(expanded, method, requestCallback, responseExtractor);
}
execute方法先生成了一个URI,然后委托给了doExecute来处理
跟进doExecute方法
protected <T> T doExecute(URI url, @Nullable HttpMethod method, @Nullable RequestCallback requestCallback,
@Nullable ResponseExtractor<T> responseExtractor) throws RestClientException { ClientHttpResponse response = null;
try {
// 生成请求
ClientHttpRequest request = createRequest(url, method);
if (requestCallback != null) {
// 设置header
requestCallback.doWithRequest(request);
}
// 执行请求,获取响应
response = request.execute();
// 处理响应
handleResponse(url, method, response);
// 获取响应体对象
return (responseExtractor != null ? responseExtractor.extractData(response) : null);
}
catch (IOException ex) {
// ... 抛出异常
}
finally {
if (response != null) {
// 关闭响应流
response.close();
}
}
}
doExecute方法的逻辑代码展示了核心的请求响应逻辑。主要包含三块内容:
1)createRequest创建请求对象
2)request.execute()执行该请求,与服务端交互获取响应数据
3)handleResponse()方法处理响应,responseExtractor生成ResponseEntity响应对象
总结
我们看到,restTemplate的核心逻辑很好的遵循了请求响应模型。doExecute的方法包含了核心逻辑代码。
后续,我们将拆开其中的几个核心方法看看实现细节。
restTemplate源码解析(二)restTemplate的核心逻辑的更多相关文章
- Mybatis源码解析(二) —— 加载 Configuration
Mybatis源码解析(二) -- 加载 Configuration 正如上文所看到的 Configuration 对象保存了所有Mybatis的配置信息,也就是说mybatis-config. ...
- Sentinel源码解析二(Slot总览)
写在前面 本文继续来分析Sentinel的源码,上篇文章对Sentinel的调用过程做了深入分析,主要涉及到了两个概念:插槽链和Node节点.那么接下来我们就根据插槽链的调用关系来依次分析每个插槽(s ...
- RxJava2源码解析(二)
title: RxJava2源码解析(二) categories: 源码解析 tags: 源码解析 rxJava2 前言 本篇主要解析RxJava的线程切换的原理实现 subscribeOn 首先, ...
- iOS即时通讯之CocoaAsyncSocket源码解析二
原文 前言 本文承接上文:iOS即时通讯之CocoaAsyncSocket源码解析一 上文我们提到了GCDAsyncSocket的初始化,以及最终connect之前的准备工作,包括一些错误检查:本机地 ...
- jQuery 源码解析二:jQuery.fn.extend=jQuery.extend 方法探究
终于动笔开始 jQuery 源码解析第二篇,写文章还真是有难度,要把自已懂的表述清楚,要让别人听懂真的不是一见易事. 在 jQuery 源码解析一:jQuery 类库整体架构设计解析 一文,大致描述了 ...
- Common.Logging源码解析二
Common.Logging源码解析一分析了LogManager主入口的整个逻辑,其中第二步生成日志实例工厂类接口分析的很模糊,本随笔将会详细讲解整个日志实例工厂类接口的生成过程! (1).关于如何生 ...
- erlang下lists模块sort(排序)方法源码解析(二)
上接erlang下lists模块sort(排序)方法源码解析(一),到目前为止,list列表已经被分割成N个列表,而且每个列表的元素是有序的(从大到小) 下面我们重点来看看mergel和rmergel ...
- element-ui 源码解析 二
Carousel 走马灯源码解析 1. 基本原理:页面切换 页面切换使用的是 transform 2D 转换和 transition 过渡 可以看出是采用内联样式来实现的 举个栗子 <div : ...
- ArrayList源码解析(二)
欢迎转载,转载烦请注明出处,谢谢. https://www.cnblogs.com/sx-wuyj/p/11177257.html 自己学习ArrayList源码的一些心得记录. 继续上一篇,Arra ...
- React的Component,PureComponent源码解析(二)
1.什么是Component,PureComponent? 都是class方式定义的基类,两者没有什么大的区别,只是PureComponent内部使用shouldComponentUpdate(nex ...
随机推荐
- 关于define('DISCUZ_ROOT', substr(dirname(__FILE__), 0, -7));的理解
关于define('DISCUZ_ROOT', substr(dirname(__FILE__), 0, -7));的理解 define('DISCUZ_ROOT', substr(dirname( ...
- Python2和Python3的字符串编码和类型
一.字符串编码和类型 任何编码格式的字符串,都可以和Unicode互相转换. gbk -> utf8 # 将字符串按指定格式进行解码,返回Unicode字符串unicode_str = gbk_ ...
- winform软件版本检测自动升级开发流程(转)
注:按此博文试验OK 基于C/S的开发有开发效率高,对于业务逻辑复杂,且不需要外网使用具有较大优势,但是弊端也不可忽视,就是升级麻烦,不可能每写一个版本就要拿着安装包给每个人去替换,这样不仅搞得自己很 ...
- windows大全
1.win7系统如何显示隐藏的文件 参考连接:https://jingyan.baidu.com/article/da1091fbc6c7d2027849d628.htm ...
- Node.js在跑Express的时候有个时候会卡住按一下Ctrl+C又好了的解决办法
Node.js编写了一个基于Express的Web应用,但是有的时候这个应用会卡死. 后来发现原因是我使用了Windows原生的命令行,会出现这个问题. 也就是说我是在文件夹下面Shift+鼠标右键, ...
- 月光大盗(moon thief)
欢迎大家玩月光大盗! welcome to play moon thief!developer email:zhangdeke@126.com
- 泰乐事(Telos)白皮书中文版 <零> 封面及目录
<泰乐事白皮书> 一个可持续发展的去中心化EOSIO网络 作者:道格拉斯·合恩 泰乐事(Telos)—— 事物的终极目标. Telos一词来源于希腊语ΤΈΛΟΣ. “一颗橡果的终极目标是成 ...
- 三节课MINI计划第四周
一.任务 二.任务一 (一)梳理产品卖点 (二)策划线上活动 三.任务二 四.周报
- 三节课MINI计划第二周
任务:完成一份用户反馈的收集,并进行分析 第一步:去你能想到的公开.非公开渠道收集最近90天,至少40条和B站相关的有效用户差评反馈,并根据你对业务的理解分类整理,以表格的形式进行整理,以图片的方式提 ...
- Django_03_模板的使用
{{ }} 变量 list类型用 'lst.索引',且不支持倒序索引,即不能识别lst.-1 dic类型用 'dic.key',去取对应的value,不支持{} 对于实例对象,通常自己重写__str_ ...