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

RestTemplate工具类用法总结

前言

这篇博客主要记录下boot项目中我们比较常用的一个工具类,RestTemplate,一个非常实用的用来调用其他微服务接口的这样一个工具类,主要总结一下他的常见用法。

RestTemplate

  • RestTemplate 是 Spring 框架提供的一个​​同步的、阻塞式的 HTTP 客户端工具​​,用于简化与其他服务的交互。它提供了丰富的 HTTP 方法支持,能自动处理 JSON/XML 等数据格式的序列化与反序列化。
  • 什么是同步和阻塞式的,调用者发起操作后,​​必须等待结果返回​​才能继续执行后续任务,在等待结果返回的期间,​​自身线程被挂起​​,无法执行任何其他操作。
  • 下面是RestTemplate的常见用法总结,我们主要关注POST、GET、通用请求这几种用法,其他用法用到的时候再查
方法类别常用方法主要功能描述典型使用场景
GETgetForObject()发送 GET 请求,返回响应体反序列化后的对象获取资源数据,如查询用户信息、商品详情等
getForEntity()发送 GET 请求,返回包含响应体及状态码等详细信息的 ResponseEntity获需要检查 HTTP 状态码或响应头时
POSTpostForObject()发送 POST 请求,提交请求体并返回响应体反序列化后的对象创建新资源,如提交订单、用户注册等
postForEntity()发送 POST 请求,返回包含响应详细信息的 ResponseEntity需要检查响应状态和头信息的创建操作
PUTput()发送 PUT 请求,通常不返回响应体更新已有资源,如修改用户信息、更新库存等
DELETEdelete()发送 DELETE 请求,通常不返回响应体删除资源,如删除用户、商品等
通用请求exchange()发送任何 HTTP 方法的请求,可灵活设置请求头和请求体需要自定义请求方法、头信息或处理复杂场景时
表单提交postForEntity()与 MultiValueMap发送 application/x-www-form-urlencoded 格式的请求提交表单登录、搜索等
文件上传postForEntity()与 MultiValueMap发送 multipart/form-data 格式的请求,上传文件用户上传头像、文件等
文件下载getForEntity()或 execute()下载文件,返回 byte[]或通过回调流式处理下载图片、文档等

添加依赖

在 Spring Boot 项目中,RestTemplate已包含在 spring-boot-starter-web依赖中:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

创建与配置实例

  • 我们可以在方法中直接new一个RestTemplate使用,使用完等待被JVM垃圾回收掉
  • 也可以通过简单的bean注入,注册到IOC容器中,然后通过@Autowired注解注入使用
@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate(); // 使用默认配置}
}@Service
public class MyService {@Autowiredprivate RestTemplate restTemplate; // 注入RestTemplatepublic String someMethod() {return restTemplate.getForObject("https://api.example.com/data", String.class);}
}
  • SpringBoot官方更推荐通过RestTemplateBuilder工具类将配置好的RestTemplate实例注册到IOC容器中,当然最后也是通过@Autowired注解注入使用
@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate(RestTemplateBuilder builder) {return builder.setConnectTimeout(Duration.ofSeconds(5)) // 设置连接超时为5秒.setReadTimeout(Duration.ofSeconds(10))    // 设置读取超时为10秒.defaultHeader("User-Agent", "My-App")    // 设置默认请求头.build();}
}
  • 这三种方式没有好坏之分,根据需要自己选择即可

通用请求(exchange)

exchange()是 RestTemplate中最​​灵活​​的方法,可以发送任何类型的 HTTP 请求(GET, POST, PUT, DELETE, PATCH等),精细控制请求细节和处理响应。
exchange方法的主要主要参数如下:

public <T> ResponseEntity<T> exchange(String url,HttpMethod method,HttpEntity<?> requestEntity,Class<T> responseType,Object... uriVariables)throws RestClientException
  • ​​url​​: 请求的目标 URL,可以包含占位符(如 {id})。
  • method​​: HTTP 方法,使用 HttpMethod 枚举指定(例如 GET, POST, PUT, DELETE)。
  • ​​requestEntity​​: HttpEntity 对象,封装了​​请求体​​和​​请求头​​。如果不需要请求体(如 GET 请求),可以将请求体设为 null。
  • ​​responseType​​: 期望的响应体类型(例如 String.class, User.class),RestTemplate 会尝试将响应反序列化为此类型。
  • ​​uriVariables​​: 用于替换 URL 中的占位符的变量值。

发送get请求

// 1. 创建 RestTemplate
RestTemplate restTemplate = new RestTemplate();// 2. 设置请求头 (例如添加认证token)
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer your-access-token"); 
headers.setContentType(MediaType.APPLICATION_JSON); // 设置内容类型// 3. 封装请求实体 (GET请求通常没有body, 所以是null)
HttpEntity<String> requestEntity = new HttpEntity<>(null, headers); // 4. 定义URL,包含占位符
String url = "https://api.example.com/users/{userId}";// 5. 发送GET请求
// 使用ResponseEntity接收完整响应,包括状态码、头和体
ResponseEntity<User> response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, User.class, // 指定希望将响应体转换成的类型12345 // 这是URI变量,用于替换URL中的{userId}
);// 6. 处理响应
if (response.getStatusCode().is2xxSuccessful()) {User user = response.getBody(); // 获取响应体对象System.out.println("User: " + user);
} else {// 处理非2xx状态码System.err.println("Request failed with status: " + response.getStatusCode());
}

发送post请求

// 1. 创建 RestTemplate
RestTemplate restTemplate = new RestTemplate();// 2. 设置请求头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON); // 表明请求体是JSON// 3. 准备要发送的数据对象
User newUser = new User("John Doe", "john.doe@example.com");// 4. 封装请求实体 (将对象作为请求体)
HttpEntity<User> requestEntity = new HttpEntity<>(newUser, headers);// 5. 定义URL
String url = "https://api.example.com/users";// 6. 发送POST请求
ResponseEntity<User> response = restTemplate.exchange(url,HttpMethod.POST,requestEntity,User.class // 期望服务器返回创建好的User对象
);// 7. 处理响应
if (response.getStatusCode().is2xxSuccessful()) {User createdUser = response.getBody();System.out.println("Created User: " + createdUser);
} else {System.err.println("Failed to create user: " + response.getStatusCode());
}

POST/GET专用方法

  • 我们除了可以使用exchange这个通用方法发送所有方式的请求,也可以使用每个请求方式对应的方法完成任务,这里只介绍get和post这两种方式
  • 如果你​​只想要响应体内容​​,并且希望直接得到对象,选择 getForObject 或 postForObject。
  • 如果你需要​​检查 HTTP 状态码、读取响应头信息​​,或者需要更全面地处理响应,选择 getForEntity 或 postForEntity。
  • 下面是两种请求方式的示例代码
// 1. 创建 RestTemplate 实例
RestTemplate restTemplate = new RestTemplate();// 2. 准备请求数据
User newUser = new User("Jane", 28); // 要发送的 JSON 对象
String postUrl = "http://example.com/api/users";// 3. 使用 postForObject - 提交并获取响应对象
// 提交 JSON 对象
User returnedUser = restTemplate.postForObject(postUrl, newUser, User.class);// 4. 使用 postForEntity - 提交并获取完整响应
ResponseEntity<User> responseEntityPost = restTemplate.postForEntity(postUrl, newUser, User.class);
HttpStatus statusCodePost = responseEntityPost.getStatusCode();
User createdUser = responseEntityPost.getBody();
HttpHeaders headersPost = responseEntityPost.getHeaders();
// 1. 创建 RestTemplate 实例
RestTemplate restTemplate = new RestTemplate();// 2. 使用 getForObject - 获取字符串响应
String url = "http://example.com/api/data";
String resultString = restTemplate.getForObject(url, String.class);
System.out.println(resultString);// 3. 使用 getForObject - 获取 JSON 并转换为自定义对象
// 假设返回的 JSON 格式为 {"name": "John", "age": 30}
public class User {private String name;private int age;// 省略 getter 和 setter
}
User user = restTemplate.getForObject(url, User.class);
System.out.println(user.getName());// 4. 使用 getForEntity - 获取包含响应细节的 ResponseEntity
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
HttpStatus statusCode = responseEntity.getStatusCode(); // 获取状态码
String body = responseEntity.getBody(); // 获取响应体
HttpHeaders headers = responseEntity.getHeaders(); // 获取响应头
http://www.xdnf.cn/news/19367.html

相关文章:

  • 如何解决虚拟机异常退出后提示“获取所有权”错误
  • 使用AI大模型Seed1.5-VL精准识别开车接打电话等交通违法行为
  • JC系列串口通信说明
  • 记录一个典型的epoll socket
  • 深度解析Fluss LockUtils类的并发艺术
  • Linux学习----归档和传输文件实用指南
  • Xshell自动化脚本大赛
  • LightGBM(Light Gradient Boosting Machine,轻量级梯度提升机)梳理总结
  • 互联网大厂AI面试:从大模型原理到场景应用的深度解析
  • 【shell】Shell脚本中的if判断条件和文件测试操作符
  • shell编程基础入门-1
  • Spring : 事务管理
  • 深度学习函数
  • 洛谷 P1395 会议 -普及/提高-
  • 一款基于selenium的前端验证码绕过爆破工具
  • java怎么实现根据指标预警的功能
  • C++多态介绍
  • 【Leetcode】17、电话号码的字母组合
  • 哪些人需要考道路运输安全员证?政策要求与适用范围
  • C++day2作业
  • 突破视界的边界:16公里远距离无人机图传模块全面解析
  • 毕业项目推荐:47-基于yolov8/yolov5/yolo11的焊缝质量检测识别系统(Python+卷积神经网络)
  • pip 镜像源配置(清华/阿里/豆瓣)详解
  • 智瞰风评 - 基于大语言模型的个人征信报告风险分析师
  • k8s--efk日志收集
  • 用简单仿真链路产生 WiFi CSI(不依赖专用工具箱,matlab实现)
  • Java数组入门教程:零基础掌握数组定义与遍历+新手避坑指南
  • Python3 lambda(匿名函数)
  • 轻量xlsx读取库xlsx_drone的编译与测试
  • 元素滚动scrollIntoView