尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

[HTTP/Spring] RestTemplate : Spring的HTTP网络请求框架

[HTTP/Spring] RestTemplate : Spring的HTTP网络请求框架
📅 发布时间:2026/6/19 11:20:54

0 序

  • java应用开发中,使用http连接,访问第三方HTTP接口,通常使用的HTTP连接请求工具为HttpClient和OKHttp。

  • 这两种HTTP连接请求工具,使用起来比较复杂,新手容易出问题。如果使用spring框架,可以使用restTemplate来进行http连接请求。

  • restTemplate默认的连接方式是java中的HttpConnection,可以使用ClientHttpRequestFactory指定不同的HTTP连接方式。

  • [Java SE/JDK/网络] 核心源码精讲:java.net.HttpURLConnection - 博客园/千千寰宇
  • [Java/网络/HTTP(S)] 基于Http(s)URLConnection的网络请求工具(HttpRequestUtils) - 博客园/千千寰宇

1 概述: RestTemplate

  • org.springframework.web.client.RestTemplate 是 Spring Resources 中一个访问第三方 RESTful API 接口的网络请求框架,用于执行HTTP请求。

  • 其暴露了一系列的模板方法API,便于操作底层的HTTP客户端库,如JDK的HttpURLConnection、Apache HttpComponents等。

  • RestTemplate 是用来消费 REST 服务的,所以 RestTemplate 的主要方法都与 REST 的 Http协议的一些方法紧密相连

例如 HEAD、GET、POST、PUT、DELETE 和 OPTIONS 等方法。
这些方法在 RestTemplate 类对应的方法为 headForHeaders()、getForObject()、postForObject()、put() 和 delete() 等。

  • RestTemplate通常作为【共享组件】使用,其配置不支持【并发修改】,因此通常在【启动时】准备好配置。

如果需要,可以在启动时创建多个配置不同的RestTemplate实例。
这些实例可以使用相同的底层ClientHttpRequestFactory,如果它们需要共享HTTP客户端资源。

2 使用指南

Maven 依赖

<dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.2.2.RELEASE</version>
</dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.7</version>
</dependency>

RestTemplate的初始配置

基本配置

@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate(ClientHttpRequestFactory factory) {return new RestTemplate(factory);}@Beanpublic ClientHttpRequestFactory simpleClientHttpRequestFactory() {SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();factory.setReadTimeout(150000); // msfactory.setConnectTimeout(150000); // msreturn factory;}
}

进阶配置

除了基础配置,还可以进行更高级的配置,例如设置连接池、自定义HttpClient等。

@Configuration
public class RestTemplateConfig {@Beanpublic HttpClientConnectionManager poolingHttpClientConnectionManager() {PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager();poolingHttpClientConnectionManager.setMaxTotal(500); // 最大连接数poolingHttpClientConnectionManager.setDefaultMaxPerRoute(100); // 同路由并发数return poolingHttpClientConnectionManager;}@Beanpublic HttpClient httpClient(HttpClientConnectionManager poolingHttpClientConnectionManager) {HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager);return httpClientBuilder.build();}@Beanpublic ClientHttpRequestFactory clientHttpRequestFactory(HttpClient httpClient) {HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();clientHttpRequestFactory.setHttpClient(httpClient);clientHttpRequestFactory.setConnectTimeout(5 * 1000); // 连接超时时间clientHttpRequestFactory.setReadTimeout(10 * 1000); // 数据读取超时时间clientHttpRequestFactory.setConnectionRequestTimeout(10 * 1000); // 连接池获取请求连接的超时时间return clientHttpRequestFactory;}@Beanpublic RestTemplate restTemplate(ClientHttpRequestFactory clientHttpRequestFactory) {RestTemplate restTemplate = new RestTemplate();restTemplate.setRequestFactory(clientHttpRequestFactory);return restTemplate;}
}

最佳实践: RestTemplateConfig

import org.apache.http.client.HttpClient;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
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 {/*** http连接管理器* @return*/@Beanpublic HttpClientConnectionManager poolingHttpClientConnectionManager() {/*// 注册http和https请求Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create().register("http", PlainConnectionSocketFactory.getSocketFactory()).register("https", SSLConnectionSocketFactory.getSocketFactory()).build();PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(registry);*/PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager();// 最大连接数poolingHttpClientConnectionManager.setMaxTotal(500);// 同路由并发数(每个主机的并发)poolingHttpClientConnectionManager.setDefaultMaxPerRoute(100);return poolingHttpClientConnectionManager;}/*** HttpClient* @param poolingHttpClientConnectionManager* @return*/@Beanpublic HttpClient httpClient(HttpClientConnectionManager poolingHttpClientConnectionManager) {HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();// 设置http连接管理器httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager);/*// 设置重试次数httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(3, true));*/// 设置默认请求头/*List<Header> headers = new ArrayList<>();headers.add(new BasicHeader("Connection", "Keep-Alive"));httpClientBuilder.setDefaultHeaders(headers);*/return httpClientBuilder.build();}/*** 请求连接池配置* @param httpClient* @return*/@Beanpublic ClientHttpRequestFactory clientHttpRequestFactory(HttpClient httpClient) {HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();// httpClient创建器clientHttpRequestFactory.setHttpClient(httpClient);// 连接超时时间/毫秒(连接上服务器(握手成功)的时间,超出抛出connect timeout)clientHttpRequestFactory.setConnectTimeout(5 * 1000);// 数据读取超时时间(socketTimeout)/毫秒(务器返回数据(response)的时间,超过抛出read timeout)clientHttpRequestFactory.setReadTimeout(10 * 1000);// 连接池获取请求连接的超时时间,不宜过长,必须设置/毫秒(超时间未拿到可用连接,会抛出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool)clientHttpRequestFactory.setConnectionRequestTimeout(10 * 1000);return clientHttpRequestFactory;}/*** rest模板* @return*/@Beanpublic RestTemplate restTemplate(ClientHttpRequestFactory clientHttpRequestFactory) {// boot中可使用RestTemplateBuilder.build创建RestTemplate restTemplate = new RestTemplate();// 配置请求工厂restTemplate.setRequestFactory(clientHttpRequestFactory);return restTemplate;}}

RestTemplate的日常使用 := 发起HTTP请求

  • RestTemplate的使用非常灵活,可以支持各种HTTP方法的请求,如GET、POST、PUT、DELETE等。

以下是一些使用RestTemplate的示例:

TempUserDto result = restTemplate.getForObject("http://localhost:8080/cs-admin/rest/getUser?userName=张三&amp;age=18", TempUserDto.class);

GET请求

  • case 1 基于普通参数,映射请求参数到 Get URL Params
String url = "http://localhost:8080/api/users/{id}";
User user = restTemplate.getForObject(url, User.class, 1);
  • case 2 基于Map对象,映射请求参数到 Get URL Params
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("userName", "张三");
paramMap.put("age", 18);
TempUser result = restTemplate.getForObject("http://localhost:8080/cs-admin/rest/getUser?userName={userName}&age={age}", TempUser.class, paramMap);

POST请求

普通访问接口

String url = "http://localhost:8080/api/users";
User newUser = new User("张三", 30);
URI location = restTemplate.postForLocation(url, newUser);
TempUser param = new TempUser();
param.setUserName("张三");
param.setAge(18);
TempUser result = restTemplate.postForObject("http://localhost:8080/cs-admin/rest/getPostUser", param, TempUser.class);

带HEAD访问接口

// 请求头信息
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.valueOf("application/json;charset=UTF-8"));
//headers.add("headParam1", "headParamValue");// 请求体内容
TempUser param = new TempUser();
param.setUserName("张三");
param.setAge(18);// 组装请求信息
HttpEntity<TempUser> httpEntity=new HttpEntity<>(param,headers);TempUser result = restTemplate.postForObject("http://localhost:8080/cs-admin/rest/getPostUser", httpEntity, TempUser.class);

无请求体的访问

仅method为post,传参方式仍然为get的param方式

Map<String, Object> paramMap = new HashMap<>();
paramMap.put("userName", "张三");
paramMap.put("age", 18);TempUser result = restTemplate.postForObject("http://localhost:8080/cs-admin/rest/getPostUserNoBody?userName={userName}&age={age}", null, TempUser.class, paramMap);
System.out.println(result);

发送可携带文件的请求

public static void main(String[] args) {final RestTemplate restTemplate = new RestTemplate();MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();map.add("fileUuid","oldDocumentTrans.getFileUuid()");map.add("sourceLanguageAbbreviation","en");map.add("targetLanguageAbbreviation","zh");HttpHeaders headers = new HttpHeaders();HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(map, headers);final ResponseEntity<String> stringResponseEntity = restTemplate.postForEntity("http://localhost:8055/documentTrans/updateLanguages",map,String.class);System.out.println(stringResponseEntity);
}

上传文件

  • 后台接口代码
@RequestMapping("uploadFile")
public TempUser uploadFile(HttpServletRequest request, TempUser form) {MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;//获取文件信息MultipartFile multipartFile = multipartHttpServletRequest.getFile("file");TempUser tempUser = new TempUser();if (multipartFile != null) {tempUser.setUserName(form.getUserName()+" "+multipartFile.getOriginalFilename());}if(form!=null){tempUser.setAge(form.getAge());}return tempUser;
}
  • RestTemplate 访问(上传文件)
// 文件
FileSystemResource file = new FileSystemResource("D:\\Java 权威指南(中文版).pdf");// 设置请求内容
MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
param.add("file", file);// 其他参数
param.add("userName", "张三");
param.add("age", 18);// 组装请求信息
HttpEntity<MultiValueMap<String, Object>> httpEntity=new HttpEntity<>(param);// 发送请求
TempUser result = restTemplate.postForObject("http://localhost:8080/cs-admin/rest/uploadFile", httpEntity, TempUser.class);

PUT请求

String url = "http://localhost:8080/api/users/{id}";
User updatedUser = new User("李四", 40);
restTemplate.put(url, updatedUser, 1);

DELETE请求

String url = "http://localhost:8080/api/users/{id}";
restTemplate.delete(url, 1);

获取HTTP响应状态

ResponseEntity<TempUser> responseEntity = restTemplate.getForEntity("http://localhost:8080/cs-admin/rest/getUser?userName=张三&age=18", TempUser.class);// 获取状态对象
HttpStatus httpStatus = responseEntity.getStatusCode();
// 获取状态码
int statusCodeValue = responseEntity.getStatusCodeValue();
// 获取headers
HttpHeaders httpHeaders = responseEntity.getHeaders();
// 获取body
TempUser result = responseEntity.getBody();

通过这些示例可以看出,RestTemplate提供了一种简洁的方式来消费RESTful服务。
它封装了HTTP连接的复杂性,使得开发者可以更专注于业务逻辑的实现。

Y 推荐文献

  • ResTemplate - Spring
  • https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html
  • [Java SE/JDK/网络] 核心源码精讲:java.net.HttpURLConnection - 博客园/千千寰宇
  • [Java/网络/HTTP(S)] 基于Http(s)URLConnection的网络请求工具(HttpRequestUtils) - 博客园/千千寰宇
  • [计算机网络/HTTP/网络请求] Okhttp: 网络请求框架 - 博客园/千千寰宇

  • [高可用/负载均衡] Ribbon : 开源的客户端式负载均衡框架 - 博客园/千千寰宇

Spring Cloud 框架中,Ribbon (负载均衡器) 是如何与 Spring 的 RestTemplate 集成的?

用 @LoadBalanced 标记后,调用 RestTemplate 的 REST 方法就会通过【负载均衡】的方式通过一定的负载策略【路由】到某个【服务实例】上。

X 参考文献

  • The Guide to RestTemplate - baeldung.com
  • Springboot之restTemplate配置及使用 - CSDN
QQ沟通交流群
本文作者: 千千寰宇
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!

相关新闻

  • 博客园-我的博客-的皮肤更换
  • script setup 在 Vue 3 中的核心作用及具体实现方式
  • 容器化改造基本原理

最新新闻

  • 2026 年 6 月 19 日北京东城区奢侈品名表回收核心门店专业测评 - 奢侈品回收
  • 2026湖北现代科技学校招生政策详解:报名条件+录取分数线+资助政策(免学费2000元/年+助学金6900元) - 速递信息
  • 物联网Lora模块串口通讯实战:数据收发与指令解析
  • 青岛名包回收避坑指南,认准资质齐全合扬门店保障交易安全 - 奢侈品交易观察员
  • 风管的连接方式优化:提升安装效率与质量
  • 《今日头条》Feed流接口逆向实战:Python爬虫全流程解析(含代码)

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号