深入浅出:Spring Boot 中 RestTemplate 的完整使用指南

在分布式系统开发中,服务间通信是常见需求。作为 Spring 框架的重要组件,RestTemplate 为开发者提供了简洁优雅的 HTTP 客户端解决方案。本文将从零开始讲解 RestTemplate 的核心用法,并附赠真实地图 API 对接案例。


一、环境准备

在 Spring Boot 项目中添加依赖:

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

通过配置类初始化 RestTemplate:

@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}

用的时候引入

    @Autowiredprivate RestTemplate restTemplate;

二、基础用法全解析
1. GET 请求的三种姿势

方式一:路径参数(推荐)

String url = "https://api.example.com/users/{id}";
Map<String, Object> params = new HashMap<>();
params.put("id", 1001);User user = restTemplate.getForObject(url, User.class, params);

方式二:显式拼接参数

String url = "https://api.example.com/users?id=1001";
User user = restTemplate.getForObject(url, User.class);

方式三:URI 构造器

UriComponentsBuilder builder = UriComponentsBuilder.fromUriString("https://api.example.com/users").queryParam("name", "John").queryParam("age", 25);User user = restTemplate.getForObject(builder.toUriString(), User.class);
2. POST 请求深度实践

发送表单数据:

MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
formData.add("username", "admin");
formData.add("password", "123456");ResponseEntity<String> response = restTemplate.postForEntity("https://api.example.com/login", formData, String.class
);

提交 JSON 对象:

User newUser = new User("Alice", 28);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);HttpEntity<User> request = new HttpEntity<>(newUser, headers);
User createdUser = restTemplate.postForObject("https://api.example.com/users", request, User.class
);

三、进阶配置技巧
1. 超时控制
@Bean
public RestTemplate customRestTemplate() {return new RestTemplateBuilder().setConnectTimeout(Duration.ofSeconds(5)).setReadTimeout(Duration.ofSeconds(10)).build();
}
2. 拦截器实战
public class LoggingInterceptor implements ClientHttpRequestInterceptor {@Overridepublic ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {logRequest(request, body);ClientHttpResponse response = execution.execute(request, body);logResponse(response);return response;}private void logRequest(HttpRequest request, byte[] body) {// 实现请求日志记录}private void logResponse(ClientHttpResponse response) {// 实现响应日志记录}
}

注册拦截器:

@Bean
public RestTemplate restTemplate() {RestTemplate restTemplate = new RestTemplate();restTemplate.setInterceptors(Collections.singletonList(new LoggingInterceptor()));return restTemplate;
}

四、实战案例:腾讯地图路线规划
@Service
public class MapService {@Value("${tencent.map.key}")private String apiKey;@Autowiredprivate RestTemplate restTemplate;public DrivingRoute calculateRoute(Location start, Location end) {String url = "https://apis.map.qq.com/ws/direction/v1/driving/"+ "?from={start}&to={end}&key={key}";Map<String, String> params = new HashMap<>();params.put("start", start.toString());params.put("end", end.toString());params.put("key", apiKey);ResponseEntity<MapResponse> response = restTemplate.getForEntity(url, MapResponse.class, params);if (response.getStatusCode() == HttpStatus.OK && response.getBody().getStatus() == 0) {return response.getBody().getResult().getRoutes().get(0);}throw new MapServiceException("路线规划失败");}
}

五、最佳实践建议
  1. 响应处理策略

    • 使用 ResponseEntity<T> 获取完整响应信息
    • 实现自定义错误处理器 ResponseErrorHandler
    • 对于复杂 JSON 结构,建议定义完整的 DTO 类
  2. 性能优化

    • 启用连接池(推荐 Apache HttpClient)
    • 合理设置超时时间
    • 考虑异步调用(结合 AsyncRestTemplate)
  3. 安全防护

    • 启用 HTTPS
    • 敏感参数加密处理
    • 配置请求频率限制

六、常见问题排查

问题1:收到 400 Bad Request

  • 检查请求参数格式
  • 确认 Content-Type 设置正确
  • 验证请求体 JSON 结构

问题2:出现乱码

  • 设置正确的字符编码
  • 检查服务端和客户端的编码一致性
  • 在 headers 中明确指定 charset=UTF-8

问题3:超时配置不生效

  • 确认使用的 RestTemplate 实例正确
  • 检查连接池配置是否覆盖超时设置
  • 验证网络防火墙设置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/82574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据处理利器:Hadoop 入门指南

一、Hadoop 是什么&#xff1f;—— 分布式计算的基石 在大数据时代&#xff0c;处理海量数据需要强大的技术支撑&#xff0c;Hadoop 应运而生。Apache Hadoop 是一个开源的分布式计算框架&#xff0c;致力于为大规模数据集提供可靠、可扩展的分布式处理能力。其核心设计理念是…

685SJBH计量管理系统

摘 要 计量&#xff0c;在我国已有五千年的历史。计量的发展与社会进步联系在一起&#xff0c;它是人类文明的重要组成部分。它的发展经历了古典阶段、经典阶段和现代阶段。而企业的计量管理是对测量数据、测量过程和测量设备的管理。 本系统通过分析现有计量系统的业务逻辑…

从0到1构建前端监控系统:错误捕获、性能采集、用户体验全链路追踪实战指南SDK实现

目录 前言为什么要做前端监控前端监控目标稳定性用户体验业务 前端监控流程常见埋点方案代码埋点可视化埋点无痕埋点 创建项目第一步、创建monitor文件&#xff0c;cmd进入文件进行npm init -y 项目初始化第二步、创建src/index.js和src/index.html文件第三步、创建webpack.con…

前端浏览器判断设备类型的方法

前端浏览器判断设备类型的方法 在前端开发中&#xff0c;判断设备类型&#xff08;如手机、平板、桌面电脑&#xff09;有多种方法&#xff0c;以下是常用的几种方式&#xff1a; 1. 使用 User Agent 检测 通过 navigator.userAgent 获取用户代理字符串进行判断&#xff1a;…

MNIST 手写数字分类

转自我的个人博客: https://shar-pen.github.io/2025/05/04/torch-distributed-series/1.MNIST/ 基础的单卡训练 本笔记本演示了训练一个卷积神经网络&#xff08;CNN&#xff09;来对 MNIST 数据集中的手写数字进行分类的过程。工作流程包括&#xff1a; 数据准备&#xff…

数据库中的 Segment、Extent、Page、Row 详解

在关系型数据库的底层存储架构中&#xff0c;数据并不是随意写入磁盘&#xff0c;而是按照一定的结构分层管理的。理解这些存储单位对于优化数据库性能、理解 SQL 执行过程以及排查性能问题都具有重要意义。 我将从宏观到微观&#xff0c;依次介绍数据库存储中的四个核心概念&…

DAMA车轮图

DAMA车轮图是国际数据管理协会&#xff08;DAMA International&#xff09;提出的数据管理知识体系&#xff08;DMBOK&#xff09;的图形化表示&#xff0c;它以车轮&#xff08;同心圆&#xff09;的形式展示了数据管理的核心领域及其相互关系。以下是基于用户提供的关键词对D…

《QDebug 2025年4月》

一、Qt Widgets 问题交流 1. 二、Qt Quick 问题交流 1.QML单例动态创建的对象&#xff0c;访问外部id提示undefined 先定义一个窗口组件&#xff0c;打印外部的id&#xff1a; // MyWindow.qml import QtQuick 2.15 import QtQuick.Window 2.15Window {id: controlwidth: …

JS | 正则 · 常用正则表达式速查表

以下是前端开发中常用的正则表达式速查表&#xff0c;包含验证规则、用途说明与示例&#xff1a; &#x1f4cc; 常用正则表达式速查表 名称正则表达式描述 / 用途示例手机号/^1[3-9]\d{9}$/中国大陆手机号13812345678 ✅座机号/^0\d{2,3}-?\d{7,8}$/固定电话010-12345678 ✅…

系统思考:个人与团队成长

四年前&#xff0c;我交付的系统思考项目&#xff0c;今天学员的反馈依然深深触动了我。 我常常感叹&#xff0c;系统思考不仅仅是一场培训&#xff0c;更像是一场持续的“修炼”。在这条修炼之路上&#xff0c;最珍贵的&#xff0c;便是有志同道合的伙伴们一路同行&#xff0…

写屏障和读屏障的区别是什么?

写屏障&#xff08;Write Barrier&#xff09;与读屏障&#xff08;Read Barrier&#xff09;的区别 在计算机科学中&#xff0c;写屏障和读屏障是两种关键的内存同步机制&#xff0c;主要用于解决并发编程中的可见性、有序性问题&#xff0c;或在垃圾回收&#xff08;GC&…

ssh -T git@github.com 测试失败解决方案:修改hosts文件

问题描述 通过SSH方式测试&#xff0c;使用该方法测试连接可能会遇到连接超时、端口占用的情况&#xff0c;原因是因为DNS配置及其解析的问题 ssh -T gitgithub.com我们可以详细看看建立 ssh 连接的过程中发生了什么&#xff0c;可以使用 ssh -v命令&#xff0c;-v表示 verbo…

大疆无人机搭载树莓派进行目标旋转检测

环境部署 首先是环境创建&#xff0c;创建虚拟环境&#xff0c;名字叫 pengxiang python -m venv pengxiang随后激活环境 source pengxiang/bin/activate接下来便是依赖包安装过程了: pip install onnxruntime #推理框架 pip install fastapi uvicorn[standard] #网络请求…

00 Ansible简介和安装

1. Ansible概述与基本概念 1.1. 什么是Ansible&#xff1f; Ansible 是一款用 Python 编写的开源 IT 自动化工具&#xff0c;主要用于配置管理、软件部署及高级工作流编排。它能够简化应用程序部署、系统更新等操作&#xff0c;并且支持自动化管理大规模的计算机系统。Ansibl…

Linxu实验五——NFS服务器

一.NFS服务器介绍 NFS服务器&#xff08;Network File System&#xff09;是一种基于网络的分布式文件系统协议&#xff0c;允许不同操作系统的主机通过网络共享文件和目录3。其核心作用在于实现跨平台的资源透明访问&#xff0c;例如在Linux和Unix系统之间共享静态数据&#…

『 测试 』测试基础

文章目录 1. 调试与测试的区别2. 开发过程中的需求3. 开发模型3.1 软件的生命周期3.2 瀑布模型3.2.1 瀑布模型的特点/缺点 3.3 螺旋模型3.3.1 螺旋模型的特点/缺点 3.4 增量模型与迭代模型3.5 敏捷模型3.5.1 Scrum模型3.5.2 敏捷模型中的测试 4 测试模型4.1 V模型4.2 W模型(双V…

红外遥控键

红外 本章节旨在让用户自定义红外遥控功能&#xff0c;需要有板载红外接收的板卡。 12.1. 获取红外遥控键值 由于不同遥控器厂家定义的按键键值不一样&#xff0c;所以配置不通用&#xff0c;需要获取实际按键对应的键值。 1 2 3 4 5 6 #设置输出等级 echo 7 4 1 7> /pr…

同一个虚拟环境中conda和pip安装的文件存储位置解析

文章目录 存储位置的基本区别conda安装的包pip安装的包 看似相同实则不同的机制实际路径示例这种差异带来的问题如何检查包安装来源最佳实践建议 总结 存储位置的基本区别 conda安装的包 存储在Anaconda(或Miniconda)目录下的pkgs和envs子目录中&#xff1a; ~/anaconda3/en…

机器学习极简入门:从基础概念到行业应用

有监督学习&#xff08;supervised learning&#xff09; 让模型学习的数据包含正确答案&#xff08;标签&#xff09;的方法&#xff0c;最终模型可以对无标签的数据进行正确处理和预测&#xff0c;可以分为分类与回归两大类 分类问题主要是为了“尽可能分开整个数据而画线”…