Spring RestTemplate使用方法总结
1. 引入依赖
首先,需要确认项目中是否直接或者间接引入过spring-web依赖,如果没有引入过,需要在pom.xml中添加以下代码引入依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.24.RELEASE</version>
</dependency>
2. 发送GET请求
使用RestTemplate发送GET请求主要有getForObject()和getForEntity()2个方法,每个方法分别提供了3种不同的重载。
2.1 使用getForObject发送GET请求(无参数)
使用getForObject()实现:
RestTemplate restTemplate = new RestTemplate();
String url = "https://www.example.com/getCurrentEnv";
String response = restTemplate.getForObject(url, String.class);
System.out.println(response);
假设以上接口返回的报文为:
{
"serverAddress": "www.example.dev.com",
"env": "dev"
}
也可以直接解析为自定义的类型:
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class EnvInfo {
private String serverAddress;
private String env;
}
RestTemplate restTemplate = new RestTemplate();
String url = "https://www.example.com/getCurrentEnv";
EnvInfo response = restTemplate.getForObject(url, EnvInfo.class);
System.out.println(JSON.toJSONString(response));
2.2 使用getForEntity发送GET请求(无参数)
也可以使用getForEntity()实现和2.1同样的功能,代码如下所示:
RestTemplate restTemplate = new RestTemplate();
String url = "https://www.example.com/getCurrentEnv";
ResponseEntity<EnvInfo> responseEntity = restTemplate.getForEntity(url, EnvInfo.class);
if (responseEntity.getStatusCode() == HttpStatus.OK) {
EnvInfo response = responseEntity.getBody();
System.out.println(JSON.toJSONString(response));
}
2.3 使用getForObject发送GET请求(带参数)
第一种方法是直接在url上拼接上参数,如下所示:
RestTemplate restTemplate = new RestTemplate();
String url = "https://www.example.com/getDataList?pageIndex=1&pageSize=20";
EnvInfo response = restTemplate.getForObject(url, EnvInfo.class);
System.out.println(JSON.toJSONString(response));
第二种方法是使用占位符添加参数,如下所示:
RestTemplate restTemplate = new RestTemplate();
String url = "https://www.example.com/getDataList?pageIndex={1}&pageSize={2}";
EnvInfo response = restTemplate.getForObject(url, EnvInfo.class, 1, 20);
System.out.println(JSON.toJSONString(response));
以上代码也可以替换为:
RestTemplate restTemplate = new RestTemplate();
String url = "https://www.example.com/getDataList?pageIndex={pageIndex}&pageSize={pageSize}";
Map<String, String> uriVariables = new HashMap<>();
uriVariables.put("pageIndex", "1");
uriVariables.put("pageSize", "20");
EnvInfo response = restTemplate.getForObject(url, EnvInfo.class, uriVariables);
System.out.println(JSON.toJSONString(response));
注意事项:
uriVariables中的key必须和url中的占位符名称一致,否则会抛出异常:
java.lang.IllegalArgumentException: Map has no value for 'pageIndex'
第三种方法是使用UriComponentsBuilder添加参数,该种方法相比于前两种方法更加灵活,可以实现动态添加参数,代码如下所示:
RestTemplate restTemplate = new RestTemplate();
String httpUrl = "https://www.example.com/getDataList";
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(httpUrl);
uriComponentsBuilder.queryParam("pageIndex", 1);
uriComponentsBuilder.queryParam("pageSize", 20);
String url = uriComponentsBuilder.toUriString();
EnvInfo response = restTemplate.getForObject(url, EnvInfo.class);
System.out.println(JSON.toJSONString(response));
2.4 使用getForEntity发送GET请求(带参数)
也可以使用getForEntity()实现和2.3同样的功能,代码如下所示:
RestTemplate restTemplate = new RestTemplate();
String httpUrl = "https://www.example.com/getDataList";
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(httpUrl);
uriComponentsBuilder.queryParam("pageIndex", 1);
uriComponentsBuilder.queryParam("pageSize", 20);
String url = uriComponentsBuilder.toUriString();
ResponseEntity<EnvInfo> responseEntity = restTemplate.getForEntity(url, EnvInfo.class);
if (responseEntity.getStatusCode() == HttpStatus.OK) {
EnvInfo response = responseEntity.getBody();
System.out.println(JSON.toJSONString(response));
}
2.5 getForObject与getForEntity的区别
getForEntity()与getForObject()相比,返回值用了ResponseEntity进行封装,可以多获取到以下2种信息:
- HTTP状态码
- Response Headers
代码示例:
RestTemplate restTemplate = new RestTemplate();
String httpUrl = "https://www.example.com/getDataList";
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(httpUrl);
uriComponentsBuilder.queryParam("pageIndex", 1);
uriComponentsBuilder.queryParam("pageSize", 20);
String url = uriComponentsBuilder.toUriString();
ResponseEntity<EnvInfo> responseEntity = restTemplate.getForEntity(url, EnvInfo.class);
System.out.println("statusCode: " + responseEntity.getStatusCode().toString());
System.out.println("statusCodeValue: " + responseEntity.getStatusCodeValue());
responseEntity.getHeaders().forEach((key, values) -> {
System.out.println(key + ": " + values);
});
输出结果:
statusCode: 200
statusCodeValue: 200
Server: [openresty]
Date: [Thu, 10 Apr 2025 05:39:02 GMT]
Content-Type: [application/json]
Transfer-Encoding: [chunked]
Connection: [keep-alive]
其中Response Headers输出部分和Chrome浏览器Network中的Response Headers是一致的:

2.6 发送GET请求(带参数及请求头)
一般情况下,请求第三方接口都需要签名、时间戳等请求头,但getForObject()和getForEntity()都不支持,
此时需要使用exchange()方法,代码如下所示:
RestTemplate restTemplate = new RestTemplate();
String httpUrl = "https://www.example.com/getDataList";
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(httpUrl);
uriComponentsBuilder.queryParam("pageIndex", 1);
uriComponentsBuilder.queryParam("pageSize", 20);
HttpHeaders headers = new HttpHeaders();
headers.set("signature", "3045022100875efcef9eb54626bb0168a6baa7c61265d0001d49243f");
headers.set("timestamp", String.valueOf(System.currentTimeMillis()));
String url = uriComponentsBuilder.toUriString();
ResponseEntity<EnvInfo> responseEntity = restTemplate.exchange(url,
HttpMethod.GET,
new HttpEntity<>(headers),
EnvInfo.class);
if (responseEntity.getStatusCode() == HttpStatus.OK) {
EnvInfo response = responseEntity.getBody();
System.out.println(JSON.toJSONString(response));
}
3. 发送POST请求
使用RestTemplate发送POST请求主要有postForObject()和postForEntity()2个方法,每个方法分别提供了3种不同的重载。
3.1 发送POST请求(带参数、json方式)
使用postForObject()实现:
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
LoginParams loginParams = new LoginParams();
loginParams.setUsername("zhangsan");
loginParams.setPassword("123456");
HttpEntity<LoginParams> request = new HttpEntity<>(loginParams, headers);
String url = "https://www.example.com/login";
String response = restTemplate.postForObject(url, request, String.class);
System.out.println(response);
LoginParams的定义如下所示:
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class LoginParams {
private String username;
private String password;
}
假设以上接口返回的报文为:
{
"code": 200,
"expire": "2025-04-11 14:42:22",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NDQzNTM3NDIsImlkZW50aXR5"
}
也可以直接解析为自定义的类型:
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class LoginResponse {
private Integer code;
private String expire;
private String token;
}
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
LoginParams loginParams = new LoginParams();
loginParams.setUsername("zhangsan");
loginParams.setPassword("123456");
HttpEntity<LoginParams> request = new HttpEntity<>(loginParams, headers);
String url = "https://www.example.com/login";
LoginResponse response = restTemplate.postForObject(url, request, LoginResponse.class);
System.out.println(JSON.toJSONString(response));
也可以使用postForEntity()实现同样的功能,代码如下所示:
ResponseEntity<LoginResponse> responseEntity = restTemplate.postForEntity(url, request, LoginResponse.class);
if (responseEntity.getStatusCode() == HttpStatus.OK) {
LoginResponse response = responseEntity.getBody();
System.out.println(JSON.toJSONString(response));
}
3.2 发送POST请求(带参数、form表单方式)
使用postForObject()实现:
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add("username", "zhangsan");
map.add("password", "123456");
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);
String url = "https://www.example.com/login";
LoginResponse response = restTemplate.postForObject(url, request, LoginResponse.class);
System.out.println(JSON.toJSONString(response));
也可以使用postForEntity()实现同样的功能,代码如下所示:
ResponseEntity<LoginResponse> responseEntity = restTemplate.postForEntity(url, request, LoginResponse.class);
if (responseEntity.getStatusCode() == HttpStatus.OK) {
LoginResponse response = responseEntity.getBody();
System.out.println(JSON.toJSONString(response));
}
3.3 postForObject与postForEntity的区别
postForObject()与postForEntity()的区别,与getForEntity()与getForObject()的区别一样,
返回值用了ResponseEntity进行封装。
4. 超时时间设置
如果需要自定义HTTP请求的连接超时时间和数据传输超时时间,代码如下所示:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Value("${restTemplate.connectTimeout:5000}")
private int connectTimeout;
@Value("${restTemplate.readTimeout:10000}")
private int readTimeout;
@Bean
public RestTemplate restTemplate() {
SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();
simpleClientHttpRequestFactory.setConnectTimeout(connectTimeout);
simpleClientHttpRequestFactory.setReadTimeout(readTimeout);
return new RestTemplate(simpleClientHttpRequestFactory);
}
}
文章持续更新,欢迎关注微信公众号「申城异乡人」第一时间阅读!
Spring RestTemplate使用方法总结的更多相关文章
- spring restTemplate使用方法
https://github.com/lenve/SimpleSpringCloud/tree/master/RestTemplate在Spring Cloud中服务的发现与消费一文中,当我们从服务消 ...
- Spring RestTemplate: 比httpClient更优雅的Restful URL访问, java HttpPost with header
{ "Author": "tomcat and jerry", "url":"http://www.cnblogs.com/tom ...
- Spring RestTemplate介绍
http://www.cnblogs.com/rollenholt/p/3894117.html RestTemplate 这篇文章打算介绍一下Spring的RestTemplate.我这边以前设计到 ...
- Spring RestTemplate详解
Spring RestTemplate详解 1.什么是REST? REST(RepresentationalState Transfer)是Roy Fielding 提出的一个描述互联系统架构风格 ...
- Spring RestTemplate中几种常见的请求方式GET请求 POST请求 PUT请求 DELETE请求
Spring RestTemplate中几种常见的请求方式 原文地址: https://blog.csdn.net/u012702547/article/details/77917939 版权声明 ...
- Spring RestTemplate 小结
关于RestTemplate 首先,你可以把它理解为一个发起请求并接收响应的工具类(功能类似浏览器). 其次,它其实是一个壳,具体还是通过调用别的接口来实现(如jdk自带的连接,或者HttpClien ...
- Spring RestTemplate 专题
相同的参数(接口的入参json打印在日志了)在PostMan中返回预期的数据,但使用RestTemplate时去提示信息错误(参数中汉字).这种情况,搞得怀疑对RestTemplate的理解了使用Re ...
- Spring RestTemplate 的介绍和使用-入门
RestTemplate是什么? 传统情况下在java代码里访问restful服务,一般使用Apache的HttpClient.不过此种方法使用起来太过繁琐.spring提供了一种简单便捷的模板类来进 ...
- Spring RestTemplate 之get请求
一,简介:Spring RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写 ...
- How to Send an HTTP Header With Every Request With Spring RestTemplate
In Know Which Apps Are Hitting Your Web Service, I showed how to write a servlet filter that enforce ...
随机推荐
- 再谈Redux
2025年再聊前端状态管理似乎是一件不必要的事,毕竟相关文章已堆积得如山如海.但在这些文章或视频内容中,我并没有找到自己喜欢的方案,准确的说是使用方式.所以这篇文章不做技术分析,主要聊聊个人对状态管理 ...
- Java线程的创建和常见方法
1.线程,进程和管程 1.1线程(Thread) 定义:线程是操作系统中能够独立运行的最小单位,是进程的一个执行分支.一个进程可以包含多个线程,它们共享同一进程的资源(如内存和文件句柄). 特点: 线 ...
- 包装类(Wrapper) 的使用
package com.ch.java2; import org.junit.Test; /* * 包装类的使用: * 1.java提供了8种基本数据类型对应的包装类,使得基本数据类型的变量具有类的特 ...
- Codeforces Round 968 (Div. 2)
题目链接:Codeforces Round 968 (Div. 2) - Codeforces 总结:C题想到了,但是写成shi了,出得有点慢. A. Turtle and Good String t ...
- kafka的基本使用(更新中)
kafka的安装路径:/usr/local/Cellar/kafka/3.2.0 kafka的配置路径:/usr/local/etc/kafka 开启zookeeper cd /usr/local/C ...
- 使用VS2022打开解决方案后每个项目都显示“不兼容”
1.问题描述 今天本地使用VS2022打开之前新建的项目(.Net6框架),突然出现每个项目都显示"不兼容"的问题,导致每个项目的文件都看不到了,如下图所示: 2.解决办法 鼠标右 ...
- 开源接流:一个方法搞定3D地图双屏联动
老大提需求:一份数据,在2D地图上可编辑,在3D地图上显示高度信息,关键是两个地图得支持视图同步,末了还来句"两天时间够了吧?"我饶了饶头,内心各种问候...,代码如何下手,特X的 ...
- Flink On Yarn的两种部署模式
一.内存Job管理模式yarn-per-job 使用介绍:常用的模式 二.内存集中管理模式yarn-session 使用介绍:当作业很少并且都较小,能快速执行完成时,可以使用.否则一般不会使用该模式 ...
- Django setting可以配置什么?
Setting配置信息 注册子应用 # 注意:需要修改Django的全局配置文`settings.py`'''1. 创建子应用 1)在pycharm中创建 python manage.py start ...
- 飞牛fnOs安装autman奥特曼机器人喂饭教程
前言 简介:autman奥特曼机器人是干什么的? autMan是机器人牵引的扩展性极强的一站式解决方案 原生支持对接qq框架.qq频道.微信框架(酷V西瓜可爱猫千寻鲲鹏).内置微信.微信客服.公众号. ...