RestTemplate 学习笔记
简介
RestTemplate是一个执行HTTP请求的同步阻塞式工具类,它仅仅只是在 HTTP 客户端库(例如 JDK HttpURLConnection,Apache HttpComponents,okHttp 等)基础上,封装了更加简单易用的模板方法 API,方便程序员利用已提供的模板方法发起网络请求和处理,能很大程度上提升我们的开发效率
依赖
1、非Spring环境下使用RestTemplate
<dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId>
</dependency>
2、Spring环境下使用 RestTemplate
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
初始化配置
@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate(){RestTemplate restTemplate = new RestTemplate(simpleClientHttpRequestFactory());return restTemplate;}public ClientHttpRequestFactory simpleClientHttpRequestFactory() {SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();factory.setReadTimeout(150000); // msfactory.setConnectTimeout(150000); // msreturn factory;}}
这种初始化方法,是使用了JDK自带的HttpURLConnection作为底层HTTP客户端实现。
可以执行配置不同的连接方式,如
HttpClient
@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate(){RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());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);}
}
OkHttp
/*** 使用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);
}
使用
restTemplate 提供的api

1、设置Header和 body
// 创建 HttpEntity
String jsonBody = JSONObject.toJSONString(weChatRefundsRequestDto);
HttpEntity<String> entity = new HttpEntity<>(jsonBody, headers);ResponseEntity<WechatRefundsResponseDto> responseEntity =restTemplate.postForEntity("url",entity,WechatRefundsResponseDto.class);
其中在entity 中设置请求头和请求体;WechatRefundsResponseDto为设置接受返回信息的对象,其他postObject 类似以上方式
public <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request,Class<T> responseType, Object... uriVariables) throws RestClientException
其中postObeject,postForEntity的请求方式中的request如果类型为HttpEntity则直接使用,不是就将request当成body放入HttpEntity中使用
2、get请求设置带参数的请求
@Autowired
private RestTemplate restTemplate;/*** 单元测试(带参的get请求)*/
@Test
public void testGetByRestFul(){//请求地址String url = "http://localhost:8080/testGetByRestFul/{1}/{2}";//发起请求,直接返回对象(restful风格)ResponseBean responseBean = restTemplate.getForObject(url, ResponseBean.class, "001", "张三");System.out.println(responseBean.toString());
}
@Autowired
private RestTemplate restTemplate;/*** 单元测试(带参的get请求)*/
@Test
public void testGetByParam(){//请求地址String url = "http://localhost:8080/testGetByParam?userName={userName}&userPwd={userPwd}";//请求参数Map<String, String> uriVariables = new HashMap<>();uriVariables.put("userName", "唐三藏");uriVariables.put("userPwd", "123456");//发起请求,直接返回对象(带参数请求)ResponseBean responseBean = restTemplate.getForObject(url, ResponseBean.class, uriVariables);System.out.println(responseBean.toString());
}
3、文件上传
@Autowired
private RestTemplate restTemplate;/*** 文件上传,post请求*/
@Test
public void upload(){//需要上传的文件String filePath = "/Users/panzhi/Desktop/Jietu20220205-194655.jpg";//请求地址String url = "http://localhost:8080/upload";// 请求头设置,multipart/form-data格式的数据HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.MULTIPART_FORM_DATA);//提交参数设置MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();param.add("uploadFile", new FileSystemResource(new File(filePath)));//服务端如果接受额外参数,可以传递param.add("userName", "张三");// 组装请求体HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(param, headers);//发起请求ResponseBean responseBean = restTemplate.postForObject(url, request, ResponseBean.class);System.out.println(responseBean.toString());
}
4、文件下载
@Autowired
private RestTemplate restTemplate;/*** 小文件下载* @throws IOException*/
@Test
public void downloadFile() throws IOException {String userName = "张三";String fileName = "c98b677c-0948-46ef-84d2-3742a2b821b0.jpg";//请求地址String url = "http://localhost:8080/downloadFile/{1}/{2}";//发起请求,直接返回对象(restful风格)ResponseEntity<byte[]> rsp = restTemplate.getForEntity(url, byte[].class, userName,fileName);System.out.println("文件下载请求结果状态码:" + rsp.getStatusCode());// 将下载下来的文件内容保存到本地String targetPath = "/Users/panzhi/Desktop/" + fileName;Files.write(Paths.get(targetPath), Objects.requireNonNull(rsp.getBody(), "未获取到下载文件"));
}
参考:
REST 客户端 :: Spring Framework
Spring之RestTemplate详解-CSDN博客
相关文章:
RestTemplate 学习笔记
简介 RestTemplate是一个执行HTTP请求的同步阻塞式工具类,它仅仅只是在 HTTP 客户端库(例如 JDK HttpURLConnection,Apache HttpComponents,okHttp 等)基础上,封装了更加简单易用的模板方法 API,…...
数据抓取时,使用动态IP要注意哪些?
在充满竞争和数据驱动的商业环境中,动态IP已成为数据抓取过程中不可或缺的工具。动态IP的应用能有效提高抓取成功率,但同时也伴随着一系列需要注意的问题。在本文中,我们将详细探讨在数据抓取时使用动态IP时应注意的事项,以确保抓…...
C++类的构造函数
1、what 类的特殊成员函数,用来初始化类对象的数据成员。 只要类对象被创建,就会被执行。 构造函数的名字和类名相同,可以包含“0”个(其实有一个编译器生成的合成默认构造函数,只是看不见而已)、1个或多个构造函数,没有返回值,不同构造函数使用参数数量或参数类型进行…...
第21~22周Java主流框架入门-Spring 3.SpringJDBC事务管理
Spring JDBC模块与事务管理课程总结 1. 课程介绍 本课程主要讲解Spring框架中的JDBC模块及其事务管理的相关内容,重点包括以下三个方面: Spring JDBC模块及核心对象JDBC Template的使用 通过学习如何使用Spring JDBC模块,了解JDBC Template…...
C++ —— 类和对象
目录 介绍类和对象 一. 类和对象——类的定义 1.访问限定符 2.类域 作用操作符:: 3.对象大小 类的实例化 内存对齐规则 4.this指针 this指针会出现的问题 5.C语言结构体与C类对比 封装的本质 C类的优点 二 .类和对象——关于成员 1.类的默认成员函数 I.构造函数 构…...
安全见闻笔记
目录 安全见闻... 1 编程语言... 1 函数式编程语言... 1 数据科学和机器学习领域... 2 Web 全栈开发... 2 移动开发... 2 嵌入式系统开发... 2 其他... 2 操作系统... 2 裸板程序... 3 操作系统... 3 网络通讯... 4 计算机硬件... 4 网络硬件... 4 移动设备硬件…...
visual studio使用vcpkg无法定位程序输入点于XXX动态链接库***.dll上
第一个解决办法:将vcpkg的bin文件夹添加到系统变量 vcpkg\installed\x64-windows\bin vcpkg\installed\x64-windows\debug\bin 第二个解决办法:将bin文件夹添加到调试->环境中...
如何保护您的服务器免受 POODLE SSLv3 漏洞的影响
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 2014年10月14日,SSL加密协议第3版中的一个漏洞被披露。这个漏洞被称为POODLE(Padding Oracle On Downgrad…...
如何用pyhton修改1000+图片的名字?
import os oldpath input("请输入文件路径(在windows中复制那个图片文件夹的路径就可以):") #注意window系统中的路径用这个‘\分割,但是编程语言中一般都是正斜杠也就是’/‘ #这里写一个代码,将 \ > / path "" fo…...
使用fpm工具制作Vim.rpm包
背景:生产环境中的CentOS 7在安全扫描中被扫描出vim存在堆缓冲区溢出(CVE-2024-45306)等漏洞。根据漏洞说明,需要升级到最新版。 奈何CentOS 7已经停止维护了,所以,想在网上找一个最新版的vim.rpm相当不容易…...
Dorado7 全局缓存当前登录人信息 localStorage
登录成功时赋值 com.gs.mcf.view/index.js // like12 add,20240906,全局缓存当前登录人信息var currentName view.get(#userNameLb).get(tip);if(window.localStorage){localStorage.setItem("currentName", currentName);} 使用 // like12 add,20240906,全局缓存…...
【2024最新版】网络安全学习路线-适合入门小白
首先说明,我是一名CTF的web手,这是我自己亲身学习网络安全的路线,希望能够帮到大家,我虽然不是大牛,但我也希望能够帮助一些网安小白找到自己学习的方向,后面有就业的详细安全技术要求,如果真想…...
高可用之限流-07-token bucket 令牌桶算法
限流系列 开源组件 rate-limit: 限流 高可用之限流-01-入门介绍 高可用之限流-02-如何设计限流框架 高可用之限流-03-Semaphore 信号量做限流 高可用之限流-04-fixed window 固定窗口 高可用之限流-05-slide window 滑动窗口 高可用之限流-06-slide window 滑动窗口 sen…...
软件测试学习笔记丨Pycharm运行与调试
本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/23454 Pycharm作为集成开发环境,除了可以编写脚本,还可以运行和调试自己的代码,下面就为大家介绍一下pycharm运行和调试代码的功能如何使用。 代码运行 编…...
flask基础学习
一、Python之flask、Django、Tornado框架 一)django 主要是用来搞快速开发的,他的亮点就是快速开发,节约成本。 正常的并发量不过10000,如果要实现高并发的话,就要对django进行二次开发,比如把整个笨重的框…...
【SSM详细教程】-04-Spring基于注解的组件扫描
精品专题: 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课…...
Keepalived:构建高可用性的秘密武器
Keepalived:构建高可用性的秘密武器 在现代的IT环境中,高可用性是确保业务连续性和用户体验的关键要素。一旦系统出现故障或停机,企业可能会面临巨大的经济损失和声誉损害。因此,实施高可用性解决方案至关重要。Keepalived作为一…...
【C++刷题】力扣-#228-汇总区间
题目描述 给定一个整数数组 nums,返回所有唯一的区间,这些区间包含数组中的每个数字,形式为 [a, b],其中 a 和 b 是数字的最小和最大值。 示例 示例 1: 输入: nums [0,1,2,4,5,7] 输出: [["0,2"],["4,5"],…...
交通银行核心系统分布式实践
1、背景:客户需求和痛点 交通银行已有核心ECIF、贷记卡核心、借记卡新核心等数百套系统上线OceanBase分布式数据库。其中,贷记卡(俗称信用卡)属于 A类核心业务系统,支撑了信用卡授权、用卡、额度、账务等核心业务功能,约7千万卡量,日交易量和数据量都在千万级别。 交通银行…...
深入剖析:.Net8 引入非root用户运行的新特性提升应用安全性
在云原生的时代,容器化技术如Docker和Kubernetes已经成为现代软件开发的重要基石。随着.Net8的发布,微软进一步优化了这些环境的支持,特别是在提升容器应用安全性方面迈出了重要一步。本文将深入探讨.Net8中非根用户功能的新增特性࿰…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
