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

Spring Boot 整合 RestTemplate:详解与实战

Spring Boot 整合 RestTemplate:详解与实战指南

    • 一、引言
    • 二、依赖添加
      • Maven 示例:
      • Gradle 示例:
    • 三、创建 RestTemplate 实例
    • 四、使用 RestTemplate 发起请求
    • 五、处理响应
    • 六、高级用法
      • 1. 自定义 RestTemplate 实例
      • 2. 文件上传、下载以及常见的 HTTP 请求
        • 2.1. 配置 RestTemplate
        • 2.2. 实现文件上传
        • 2.3. 实现文件下载
        • 2.4. 实现 GET、PUT 和 DELETE 请求
          • GET 请求
          • PUT 请求
          • DELETE 请求
    • 七、总结

本文将深入讲解如何在 Spring Boot 应用中整合 RestTemplate,包括依赖添加、实例创建、请求发送、响应处理以及一些高级用法。通过本文的学习,将能够熟练地在 Spring Boot 应用中调用远程 RESTful 服务。

一、引言

企业使用 RESTful API 来实现前后端分离。Spring Boot 提供了便捷的方式来整合 RestTemplate,使能够轻松地调用远程 RESTful 服务。本文将详细讲解 Spring Boot 整合 RestTemplate 的方法。

二、依赖添加

在开始之前,需要确保项目中包含了 RestTemplate 的依赖。以下是使用 Maven 和 Gradle 添加依赖的示例:

Maven 示例:

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

Gradle 示例:

    dependencies {implementation 'org.springframework.boot:spring-boot-starter-web'}

三、创建 RestTemplate 实例

在 Spring Boot 应用中,可以通过以下方式创建 RestTemplate 实例:

    import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.HttpEntity;import org.springframework.http.HttpMethod;import org.springframework.http.ResponseEntity;import org.springframework.web.client.RestTemplate;public class MyService {@Autowiredprivate RestTemplate restTemplate;public String callRemoteService(String url) {HttpEntity<String> entity = new HttpEntity<>("parameters", null);ResponseEntity<String> response = restTemplate.exchange(url,HttpMethod.GET,entity,String.class);return response.getBody();}}

四、使用 RestTemplate 发起请求

callRemoteService 方法中,RestTemplate 的 exchange 方法发起 HTTP 请求。exchange 方法接收以下参数:

  • HttpMethod:请求方法(GET, POST, PUT, DELETE 等)。
  • HttpEntity:包含请求头和请求体的实体对象。
  • Class<T>:期望的响应类型。

五、处理响应

exchange 方法返回一个 ResponseEntity 对象,它包含了响应的状态码、头信息和响应体。你可以根据需要处理这些信息:

  public class MyService {// ...public ResponseEntity<String> callRemoteServiceWithResponse(String url) {HttpEntity<String> entity = new HttpEntity<>("parameters", null);ResponseEntity<String> response = restTemplate.exchange(url,HttpMethod.GET,entity,String.class);return response;}}

六、高级用法

1. 自定义 RestTemplate 实例

在某些情况下,可能需要自定义 RestTemplate 实例,例如添加拦截器、设置连接超时等。以下是一个自定义 RestTemplate 实例的示例:

    import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;import org.springframework.web.client.RestTemplate;public RestTemplate createCustomRestTemplate() {HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();requestFactory.setConnectTimeout(5000); // 设置连接超时时间requestFactory.setReadTimeout(5000); // 设置读取超时时间return new RestTemplate(requestFactory);}

2. 文件上传、下载以及常见的 HTTP 请求

2.1. 配置 RestTemplate

首先,需要在 Spring Boot 项目中配置 RestTemplate。在 application.properties 文件中添加以下配置:

# application.properties
spring.resttemplate.connect-timeout=5000
spring.resttemplate.read-timeout=5000

然后在配置类中创建一个 RestTemplate Bean:

    import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.client.RestTemplate;@Configurationpublic class AppConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}}
2.2. 实现文件上传

文件上传是一个常见的需求,特别是在处理用户上传的图片、文档等资源时。以下是一个使用 RestTemplate 实现文件上传的示例:

    import org.springframework.beans.factory.annotation.Autowired;import org.springframework.core.io.FileSystemResource;import org.springframework.http.HttpEntity;import org.springframework.http.HttpHeaders;import org.springframework.http.MediaType;import org.springframework.util.LinkedMultiValueMap;import org.springframework.util.MultiValueMap;import org.springframework.web.client.RestTemplate;public class FileService {@Autowiredprivate RestTemplate restTemplate;public void uploadFile(String url, String filePath) {FileSystemResource file = new FileSystemResource(filePath);MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();body.add("file", file);HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.MULTIPART_FORM_DATA);HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);restTemplate.postForObject(url, requestEntity, String.class);}}

在这个示例中,首先创建了一个 FileSystemResource 对象来表示要上传的文件,然后将其添加到 MultiValueMap 中。接着,设置了请求头的 Content-Typemultipart/form-data,最后通过 RestTemplate 发送 POST 请求。

2.3. 实现文件下载

文件下载同样是一个常见的需求,特别是在提供资源给用户时。以下是一个使用 RestTemplate 实现文件下载的示例:

    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.web.client.RestTemplate;import java.io.File;import java.util.Arrays;public class FileService {@Autowiredprivate RestTemplate restTemplate;public void downloadFile(String url, String savePath) {HttpHeaders headers = new HttpHeaders();headers.setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM));HttpEntity<String> requestEntity = new HttpEntity<>(headers);ResponseEntity<byte[]> response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, byte[].class);if (response.getStatusCode().is2xxSuccessful()) {byte[] fileBytes = response.getBody();// 将文件字节数组保存到指定路径FileUtils.writeByteArrayToFile(new File(savePath), fileBytes);}}}

在这个示例中,设置了请求头的 Acceptapplication/octet-stream,以接收二进制文件数据。然后通过 RestTemplate 发送 GET 请求,并将响应的文件字节数组保存到指定路径。

2.4. 实现 GET、PUT 和 DELETE 请求

除了文件上传和下载,还需要处理常见的 HTTP 请求,如 GET、PUT 和 DELETE。以下是这些请求的实现示例:

GET 请求
    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.web.client.RestTemplate;import java.util.Arrays;public class FileService {@Autowiredprivate RestTemplate restTemplate;public String getRequest(String url) {HttpHeaders headers = new HttpHeaders();headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));HttpEntity<String> requestEntity = new HttpEntity<>(headers);ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class);if (response.getStatusCode().is2xxSuccessful()) {return response.getBody();} else {return null;}}}
PUT 请求
    import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.HttpEntity;import org.springframework.http.HttpHeaders;import org.springframework.http.MediaType;import org.springframework.web.client.RestTemplate;public class FileService {@Autowiredprivate RestTemplate restTemplate;public void putRequest(String url, String requestBody) {HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);HttpEntity<String> requestEntity = new HttpEntity<>(requestBody, headers);restTemplate.put(url, requestEntity);}}
DELETE 请求
    import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.HttpEntity;import org.springframework.http.HttpHeaders;import org.springframework.web.client.RestTemplate;public class FileService {@Autowiredprivate RestTemplate restTemplate;public void deleteRequest(String url) {HttpHeaders headers = new HttpHeaders();HttpEntity<String> requestEntity = new HttpEntity<>(headers);restTemplate.delete(url, requestEntity);}}

七、总结

本文详细讲解了 Spring Boot 整合 RestTemplate 的方法,包括依赖添加、实例创建、请求发送、响应处理以及一些高级用法。

相关文章:

Spring Boot 整合 RestTemplate:详解与实战

Spring Boot 整合 RestTemplate&#xff1a;详解与实战指南 一、引言二、依赖添加Maven 示例&#xff1a;Gradle 示例&#xff1a; 三、创建 RestTemplate 实例四、使用 RestTemplate 发起请求五、处理响应六、高级用法1. 自定义 RestTemplate 实例2. 文件上传、下载以及常见的…...

【利用模板模式和责任链模式实现数据校验】

利用模板模式和责任链模式实现数据校验 一、业务背景二、模板模式和责任链模式代码实现1、数据校验抽象处理器ValidateHandler2、数据校验责任链工具类ValidateChainUtil3、网元调整数据校验抽象类AbstractNodeCheckHandler4、依次定义3个责任链handler&#xff0c;通过Order注…...

学习笔记第十九天

1.标准I/O的基本概念 标准输入&#xff08;stdin&#xff09;&#xff1a;默认是指键盘输入。 标准输出&#xff08;stdout&#xff09;&#xff1a;默认是指显示器输出。 标准错误&#xff08;stderr&#xff09;&#xff1a;用于输出错误信息&#xff0c;也是指向显示器&…...

设计模式 - 单例模式

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、单例模…...

fastapi之WebSockets

文章目录 WebSockets基本概念FastAPI 中的 WebSocket 支持WebSocket 应用示例示例 1: 简单的 WebSocket 连接解释 示例 2: 广播消息的 WebSocket 实现解释 客户端代码示例 完整示例项目结构服务器端代码 (main.py)解释 简单的前端客户端 (static/index.html)解释 测试 相关代码…...

Kotlin 和 Java区别

Kotlin 和 Java 是两种主要用于 Android 开发的编程语言&#xff0c;它们之间有一些关键的区别&#xff1a; 1. 语法简洁性&#xff1a; Kotlin&#xff1a;具有更简洁的语法&#xff0c;减少了冗余代码。例如&#xff0c;Kotlin 支持类型推断&#xff0c;避免了大量的样板…...

windows 达梦到ORACLE dblink

达梦通过DBLINK访问Oracle数据库有两种: 方式一&#xff1a;通过Oracle oci接口; 方式二&#xff1a;一种是通过ODBC数据源的方式。 本案例选择使用Oralce OCI的方式去访问Oracle数据库。 配置Oracle OCI客户端 下载地址&#xff1a;https://www.oracle.com/database/techno…...

大数据应用组件

1、数据存储1.1、hive->hdfs、mapredus1.2、ClickHouse1.3、Elasticsearch1.4、PostgreSQL1.5、HBase 2、数据抽取2.1、Kettle2.2、DataX2.3、Canal2.4、Flink CDC2.5、Sqoop2.6、Filebeat&Logstash(日志) 3、任务编排3.1、Apache DolphinScheduler 4、数据处理4.1、spa…...

Docker Remote API未授权访问漏洞

9.Docker Remote API未授权访问漏洞 步骤一:使用以下Fofa语句对Docker产品进行搜索. port"2375" 步骤二:直接使用浏览器访问以下路径 /version#查看版本信息 /info#查看容器信息 漏洞修复 1.端口访问控制 对2375端口做网络访问控制&#xff0c;如设置iptables…...

算法训练.

一.扩散 题解&#xff1a; 计算点之间的距离&#xff0c;然后对图进行处理即可&#xff0c;这个数据规模较小&#xff0c;因此我使用了floyd,还有最小生成树和二份答案加并查集的写法&#xff1b; 代码&#xff1a; #include <iostream> #include <cstring> #in…...

08、MySQL-事务

目录 1、事务简介 2、事务操作 2.1 方式一 2.2 方式二 3、事务四大特性 4、并发事务问题 5、事务隔离级别 1、事务简介 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c…...

2024 年的 Node.js 生态系统

数据来源于 Node.js Toolbox&#xff0c;网站展示了 Node.js 生态系统中积极维护且流行的库。...

LVS(Linux Virtual Server)

简介 LVS&#xff08;Linux Virtual Server&#xff09;是一个高性能的开源负载均衡解决方案&#xff0c;它通过在Linux内核中实现IPVS&#xff08;IP Virtual Server&#xff09;模块来提供负载均衡功能。LVS能够将外部请求根据特定的算法分发到后端的多个服务器上&#xff0c…...

回顾Python

一、python基础 1、环境python2、python3 [rootpython ~]# yum list installed | grep python #检查是否有python包 [rootpython ~]# yum list installed | grep epel #检查是否有epel包 [rootpython ~]# yum -y install epel-release [rootpython ~]# yum -y install …...

【数据结构】队列,你必须知道的内部原理!!!

&#x1f31e;&#x1f31e;&#x1f31e;生活本就沉闷&#xff0c;但跑起来就会有风 ~~~ 前言&#xff1a; &#x1f31f;&#x1f31f;Hello家人们&#xff0c;这期讲解数据结构队列的基础知识&#xff0c;希望你能帮到屏幕前的你。 &#x1f4da;️上期博客在这里&#xff1…...

Ubuntu24.04编译FFmpeg6.1(支持x264、x265、fdk-acc)

FFmpeg是一个开源的多媒体处理工具集&#xff0c;可以用于处理音频、视频和图片等多种媒体格式。由于其强大的功能和灵活性&#xff0c;FFmpeg被广泛应用在多媒体处理领域&#xff0c;包括音视频编解码、流媒体服务器、视频转码等。FFmpeg7.0 版本移除了 6.0 之前已弃用的 API&…...

顺序表-数据结构

一、结构定义 顺序表是通常是数组&#xff0c;要求数据连续存储。顺序表又分为定长顺序表和变长顺序表&#xff0c;本文实现后者。 1、头文件 #include <stdio.h> #include <stdlib.h> 2、定长顺序表 #define MAX 100 定长顺序表结构 typedef struct SqList {…...

如何写出更优雅的并行程序?

如何写出更优雅的并行程序&#xff1f; 并行编程关于并行编程的一些理解 并行编程 并行编程是一种利用多个处理器或计算资源同时执行多个任务的编程方式&#xff0c;以提高计算效率和性能。允许程序员编写可以在多核处理器或多个计算机节点上同时执行的程序&#xff0c;以充分…...

C#中的Hangfire和Quartz.NET 任务调度的区别

Hangfire 和 Quartz.NET 是两种常见的 C# 任务调度库&#xff0c;它们有不同的特点和使用场景。以下是这两个库的详细对比&#xff0c;包括它们的主要功能、适用场景以及关键区别。 目录 Hangfire 主要功能 适用场景 示例代码 Quartz.NET 主要功能 适用场景 示例代码 …...

银行卡二三四要素验证-银行卡二三四要素验证接口-银行卡二三四要素

接口简介&#xff1a;全面覆盖&#xff0c;支持所有带银联标识的银行卡; 高准确性-验证结果实时返回&#xff0c;准确率达99%; 高稳定性-双通道自动切换&#xff0c;保证业务不间断; 专业服务-7*24小时服务&#xff0c;极速响应&#xff0c;为用户保驾护航; 接口地址&#xff1…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...