RestTemplate超简单上手
目录
1.什么是RestTemplate?
2.RestTemplate的使用
2.1spring环境下
注意1:RestTemplate中发送请求execute()和exchange()方法的区别
execute()方式
exchange()方式
二者的区别
注意2:进阶配置——底层HTTP客户端
2.2非spring环境下
1.什么是RestTemplate?
RestTemplate是一款Spring框架中的HTTP客户端工具类库,它封装了大量的HTTP请求处理代码,使得我们可以方便地进行HTTP请求的发送与处理。RestTemplate支持多种HTTP请求方式,例如GET、POST、PUT、DELETE等,同时也支持参数的传递与响应结果的解析等功能,使得我们在进行RESTful风格的API开发时更加方便。
2.RestTemplate的使用
RestTemplate的使用分为俩种方式,一种是spring环境,一种是非spring环境
2.1spring环境下
添加pom依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
添加RestTemplate配置类:
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestTemplateConfig {/*** 没有实例化RestTemplate时,初始化RestTemplate* @return*/@ConditionalOnMissingBean(RestTemplate.class)@Beanpublic RestTemplate restTemplate(){RestTemplate restTemplate = new RestTemplate();return restTemplate;}
}
使用示例:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.client.RequestCallback;
import org.springframework.web.client.ResponseExtractor;
import org.springframework.web.client.RestTemplate;import java.util.Map;/*** RestTemplate Use Example Demo** @author JiuLi*/
@Controller
public class RestTemplateCtrl {@Autowiredprivate RestTemplate restTemplate;/*** exchange()形式** @param data* @return*/@RequestMapping(value = "/resttemplate/getNative", method = RequestMethod.GET)public String restTemplateNativeTest(Map data) {// 请求头HttpHeaders httpHeaders = new HttpHeaders();HttpEntity<Object> httpEntity = new HttpEntity<>(data, httpHeaders);String url = "";// 发送请求ResponseEntity entity = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class);// 获取请求回调JSONObject jsonObject = JSONObject.parseObject(JSON.toJSON(entity.getBody()).toString());// 打印请求返回信息return jsonObject.toJSONString();}/*** execute()形式** @param data* @return*/@RequestMapping(value = "/resttemplate/getreqAndrep", method = RequestMethod.GET)public String restTemplateTest(Map data) {// 请求头HttpHeaders httpHeaders = new HttpHeaders();HttpEntity<Object> httpEntity = new HttpEntity<>(httpHeaders);// 请求提取器RequestCallback requestCallback = restTemplate.httpEntityCallback(httpEntity, Map.class);// 响应提取器ResponseExtractor<ResponseEntity<Map>> responseExtractor = restTemplate.responseEntityExtractor(Map.class);String url = "";// 发送请求ResponseEntity entity = restTemplate.execute(url, HttpMethod.GET, requestCallback, responseExtractor, data);// 获取请求回调JSONObject jsonObject = JSONObject.parseObject(JSON.toJSON(entity.getBody()).toString());// 打印请求返回信息return jsonObject.toJSONString();}}
注意1:RestTemplate中发送请求execute()和exchange()方法的区别
在使用RestTemplate发送HTTP请求时,我们通常会使用execute()或exchange()方法来发送请求。这两个方法的作用类似,但是有一些区别,在本篇博客中我们将介绍execute()和exchange()方法的区别。
execute()方式
execute()方法是RestTemplate中最基本的请求方法,它的定义如下:
public <T> T execute(String url, HttpMethod method, RequestCallback requestCallback,ResponseExtractor<T> responseExtractor) throws RestClientException {// ...
}
传入四个参数:请求URL、HTTP请求方法、RequestCallback对象和ResponseExtractor对象。其中,RequestCallback代表着请求体,可以通过实现该接口来设置请求体的内容;ResponseExtractor代表着响应结果的处理器,可以通过实现该接口来对响应结果进行解析。
execute()方法可以返回任意类型的响应结果,包括自定义类型、String类型等由ResponseExtractor对象决定。
exchange()方式
exchange()方法的定义如下:
public <T> ResponseEntity<T> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity,Class<T> responseType, Object... uriVariables) throws RestClientException {// ...
}
与execute()方法不同,exchange()方法返回的是ResponseEntity<T>
类型的响应结果对象。ResponseEntity包含了响应状态码,响应头以及响应体等信息。
exchange()方法的请求体为HttpEntity对象,而非RequestCallback对象。HttpEntity用于封装请求体和请求头信息。
除此之外,在exchange()方法中还可以传入uriVariables参数。这个参数用于替换URL中的变量,例如:
String url = "http://localhost:8080/{id}";
ResponseEntity<User> response = restTemplate.exchange(url, HttpMethod.GET, null, User.class, 1);
在上述代码中,我们通过exchange()
方法使用占位符{id}
替换URL中的变量,并将变量的值设置为1。
二者的区别
execute()方法更加灵活,可以处理任意类型的响应结果,同时请求体也更加自由。而exchange()方法则更加直观,能够提供完整的响应对象,方便进行状态码和响应头的解析。
当我们只需要简单地获取响应结果时,可以使用execute()方法;而在需要对响应状态码、响应头等信息进行处理时,建议使用exchange()方法。
注意2:进阶配置——底层HTTP
客户端
如上方式添加的RestTemplate配置类默认使用的是JDK自带的HttpURLConnection客户端作为底层的HTTP客户端实现的,实际上使用默认的HttpURLConnection客户端已经足够我们进行一系列的Http请求操作了,但是具体受限于某些需求或项目要求,HttpURLConnection客户端不满足一些我们的需求,那么我们可以通过配置替换的方式,指定使用HttpClient客户端替换默认的客户端;HttpClient是一个功能强大、高度可定制、性能优越的HTTP客户端工具类库,它可以满足更多复杂的HTTP请求需求。
使用HttpClient客户端好处:
1.支持连接池:使用HttpClient作为底层客户端可以支持连接池机制,减少每次请求建立连接和关闭连接的开销,提高请求效率。而默认的HttpURLConnection会在每次请求时重新建立连接,效率较低。
2.支持自定义拦截器:使用HttpClient可以通过自定义拦截器来实现一些特殊的功能,例如HTTP认证、请求重试等。而HttpURLConnection则很难通过自定义拦截器来实现这些功能。
3.支持更多协议:HttpClient支持HTTP协议以外的协议,例如HTTPS、FTP等。
缺点:
1.需要额外配置:如果使用HttpClient作为底层客户端,需要引入相应的依赖,并进行相应的配置,增加了使用成本。
2.可能会有线程安全的问题:默认情况下,HttpClient是不线程安全的,如果在多线程环境下并发使用同一个HttpClient实例,可能会出现线程安全问题。为了避免这个问题,我们可以采用各种线程安全的HttpClient实现方式,例如使用PoolingHttpClientConnectionManager来管理连接池。
使用Httpclient,在RestTemplateConfig配置即可:
首先需要添加pom依赖:
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>${httpclient.version}</version>
</dependency>
方式一:
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestTemplateConfig {/*** 没有实例化RestTemplate时,初始化RestTemplate* @return*/@ConditionalOnMissingBean(RestTemplate.class)@Beanpublic RestTemplate restTemplate(){RestTemplate restTemplate = new RestTemplate();return restTemplate;}/*** 使用HttpClient作为底层客户端* @return*/private ClientHttpRequestFactory getClientHttpRequestFactory() {int timeout = 5000;RequestConfig config = RequestConfig.custom().setConnectTimeout(timeout).setConnectionRequestTimeout(timeout).setSocketTimeout(timeout).build();CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build();return new HttpComponentsClientHttpRequestFactory(client);}}
方式二:
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestTemplateConfig {/*** 没有实例化RestTemplate时,初始化RestTemplate* @return*/@ConditionalOnMissingBean(RestTemplate.class)@Beanpublic RestTemplate restTemplate(){CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(new PoolingHttpClientConnectionManager()).build();HttpComponentsClientHttpRequestFactory requestFactory =new HttpComponentsClientHttpRequestFactory();requestFactory.setHttpClient(httpClient);RestTemplate restTemplate = new RestTemplate();return restTemplate;}}
当然还有其他的Http客户端,例如OKHttpClient,OKHttpClient优于Httpclient优于默认的HttpURLConnection;具体如何选择看开发需求,以下是使用OKHttpClient的配置:
import okhttp3.OkHttpClient;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;import java.util.concurrent.TimeUnit;@Configuration
public class RestTemplateConfig {/*** 没有实例化RestTemplate时,初始化RestTemplate* @return*/@ConditionalOnMissingBean(RestTemplate.class)@Beanpublic RestTemplate restTemplate(){RestTemplate restTemplate = new RestTemplate();return restTemplate;}/*** 使用OkHttpClient作为底层客户端* @return*/private ClientHttpRequestFactory getClientHttpRequestFactory(){OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(5, TimeUnit.SECONDS).writeTimeout(5, TimeUnit.SECONDS).readTimeout(5, TimeUnit.SECONDS).build();return new OkHttp3ClientHttpRequestFactory(okHttpClient);}}
2.2非spring环境下
导入依赖:
如果当前项目不是Spring
项目,加入spring-web
包,即可引入RestTemplate
类
<dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.2.6.RELEASE</version>
</dependency>
使用new的形式获取到RestTemplate的实例,以发送get请求为例进行测试:
public void simpleTest() {RestTemplate restTemplate = new RestTemplate();String url = "";String str = restTemplate.getForObject(url, String.class);System.out.println(str);
}
所以,当在非spring环境下需要使用resttemplate时,只需要使用New获取到restTmeplate的实例,然后再进行之后所需要的收发Http请求的操作即可
相关文章:
RestTemplate超简单上手
目录 1.什么是RestTemplate? 2.RestTemplate的使用 2.1spring环境下 注意1:RestTemplate中发送请求execute()和exchange()方法的区别 execute()方式 exchange()方式 二者的区别 注意2:进阶配置——底层HTTP客户端 2.2非spring环境下 1.什么是R…...
监控系统设计原则及实现目标
1.1.1.1 1 .完善的设计理念: 包括符合国际发展潮流的特性化设计,完整的安防监控及围墙周界报警系统 的布线、设备安装、调试、测试、验收的“交钥匙”工程管理制度,以及符合标 准的质量控制体系。 1.1.1.2 设计原则…...

VulnHub项目:MONEYHEIST: CATCH US IF YOU CAN
靶机名称: MONEYHEIST: CATCH US IF YOU CAN 地址:MoneyHeist: Catch Us If You Can ~ VulnHub 这个系列是一部剧改编,还是挺好看的,大家有兴趣可以去看看! 废话不多说,直接上图开始! 渗透…...
对象存储OSS简介,一分钟了解对象存储OSS
对象存储(Object Storage)是一种新兴的数据存储方式,与传统的文件系统和块存储不同,对象存储以对象为基本单位进行数据管理和存储。在对象存储中,每个对象都有唯一的标识符,并包含了数据本身以及与之相关的…...

SpringCloud_微服务基础day2(Eureka简介与依赖导入,服务注册与发现)
p6:Eureka简介与依赖导入 前面我们了解了如何对单体应用进行拆分,并且也学习了如何进行服务之间的相互调用,但是存在一个问题,就是虽然服务拆分完成,但是没有一个比较合理的管理机制,如果单纯只是这样编写,…...
#tmux# #终端# 常用工具tmux
tmux tmux是一个终端复用工具,允许用户在一个终端会话中同时管理多个终端窗口,提高了终端使用效率,尤其在服务器上进行远程管理时更加实用。在tmux中,可以创建多个终端窗口和窗格,并在这些窗口和窗格之间自由切换&…...

后端服务架构高性能设计之道
“N 高 N 可”,高性能、高并发、高可用、高可靠、可扩展、可维护、可用性等是后台开发耳熟能详的词了,它们中有些词在大部分情况下表达相近意思。本序列文章旨在探讨和总结后台架构设计中常用的技术和方法,并归纳成一套方法论。 前言 本文主…...

Python中的Time和DateTime
Python在处理与时间相关的操作时有两个重要模块:time和datetime。在本文中,我们介绍这两个模块并为每个场景提供带有代码和输出的说明性示例。 time模块主要用于处理时间相关的操作,例如获取当前时间、时间的计算和格式化等。它提供了一些函数…...

UNIX网络编程卷一 学习笔记 第十九章 密钥管理套接字
随着IP安全体系结构(IPsec)的引入,密钥加密和认证密钥的管理越来越需要一套标准机制。RFC 2367介绍了一个通用密钥管理API,可用于IPsec和其他网络安全服务,该API创建了一个新协议族,即PF_KEY域,…...

excel如何实现识别文本在对应单元格填上数据?
要实现 Excel 识别文本在对应单元格填上数据,有以下两种方法: 方法一:使用 VLOOKUP 函数 1. 在 Excel 工作表中,输入一个表格,列名为对应的文本,行名为不同条目。 2. 准备输入数据,在一个新的…...

Groovy 基本语法
一、简介 类型转换:当需要时,类型之间会自动发生类型转换: 字符串(String)、基本类型(如int) 和类型的包装类(如Integer) 类说明:如果在一个groovy 文件中没有任何类定义,它将被当做script 来处理,也就意味着这个文件将…...
系统学习IT技术的方法与实践
系统学习IT技术的方法与实践 作为一名技术人员,在学习新的IT技术时,采取系统性的学习方法是至关重要的。这样可以帮助我们更好地理解和掌握技术,并提高学习效率。下面我将分享一些我个人在系统学习IT技术方面的方法和实践。 1. 设定明确的学…...

聊聊TCP协议的粘包、拆包以及http是如何解决的?
目录 一、粘包与拆包是什么? 二、粘包与拆包为什么发生? 三、遇到粘包、拆包怎么办? 解决方案1:固定数据大小 解决方案2:自定义请求协议 解决方案3:特殊字符结尾 四、HTTP如何解决粘包问题的…...

一百二十、Kettle——用kettle把Hive数据同步到ClickHouse
一、目标 用kettle把hive数据同步到clickhouse,简单运行、直接全量导入数据 工具版本:kettle:8.2 Hive:3.1.2 ClickHouse21.9.5.16 二、前提 (一)kettle连上hive (二)kettle连上cli…...

PyTorch 提示和技巧:从张量到神经网络
张量和梯度 我们将深入探讨使用 PyTorch 构建自己的神经网络必须了解的 2 个基本概念:张量和梯度。 张量 张量是 PyTorch 中的中央数据单元。它们是类似于数组的数据结构,在功能和属性方面与 Numpy 数组非常相似。它们之间最重要的区别是 PyTorch 张量…...

第五期:字符串的一些有意思的操作
文章目录 1. 替换空格2. 字符串的左旋转3. 答案代码3.1 替换空格3.2 字符串的左旋转 PS:每道题解题方法不唯一,欢迎讨论!每道题后都有解析帮助你分析做题,答案在最下面,关注博主每天持续更新。 1. 替换空格 题目描述 请…...
使用Anaconda3结合vscode来实现django项目的建立(绝好的介绍)20230608
问题:如何使用Anaconda3结合vscode来实现django项目的建立? 回答: 知识背景 Anaconda3的安装包默认会安装最新版本的Python解释器。如果您想在安装时指定Python解释器的版本,您需要下载对应版本的Anaconda3。例如,如果您想使用Python 3.7&…...

【软件测试】软件测试的基本概念和开发模型
1. 前言 在进行软件测试的学习之前,我们要了解软件测试一些基本概念. 这些基本概念将帮助我们更加明确工作的目标以及软件测试到底要做什么. 2. 软件测试的基本概念 软件测试的基本概念有3个,分别是需求,测试用例和BUG. 2.1 需求 这里的需求还可以分为 用户需求和软件需求,用户…...

接口测试 —— 接口测试定义
1、接口测试概念 (重点) 接口测试是测试系统组件间接口的一种测试,它界于单元测试与系统测试中间。 接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。 测试的重点是要检查数据的交换,传递和控制管理过…...

2015 年一月联考逻辑真题
2015 年一月联考逻辑真题 真题(2015-26) 26.晴朗的夜晚我们可以看到满天星斗,其中有些是自身发光的恒星,有些是自身不发光但可以反射附近恒星光的行星。恒星尽管遥远,但是有些可以被现有的光学望远镜“看到”。和恒星不…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...