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种信息:

  1. HTTP状态码
  2. 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使用方法总结的更多相关文章

  1. spring restTemplate使用方法

    https://github.com/lenve/SimpleSpringCloud/tree/master/RestTemplate在Spring Cloud中服务的发现与消费一文中,当我们从服务消 ...

  2. Spring RestTemplate: 比httpClient更优雅的Restful URL访问, java HttpPost with header

    { "Author": "tomcat and jerry", "url":"http://www.cnblogs.com/tom ...

  3. Spring RestTemplate介绍

    http://www.cnblogs.com/rollenholt/p/3894117.html RestTemplate 这篇文章打算介绍一下Spring的RestTemplate.我这边以前设计到 ...

  4. Spring RestTemplate详解

    Spring RestTemplate详解   1.什么是REST? REST(RepresentationalState Transfer)是Roy Fielding 提出的一个描述互联系统架构风格 ...

  5. Spring RestTemplate中几种常见的请求方式GET请求 POST请求 PUT请求 DELETE请求

    Spring RestTemplate中几种常见的请求方式 原文地址: https://blog.csdn.net/u012702547/article/details/77917939   版权声明 ...

  6. Spring RestTemplate 小结

    关于RestTemplate 首先,你可以把它理解为一个发起请求并接收响应的工具类(功能类似浏览器). 其次,它其实是一个壳,具体还是通过调用别的接口来实现(如jdk自带的连接,或者HttpClien ...

  7. Spring RestTemplate 专题

    相同的参数(接口的入参json打印在日志了)在PostMan中返回预期的数据,但使用RestTemplate时去提示信息错误(参数中汉字).这种情况,搞得怀疑对RestTemplate的理解了使用Re ...

  8. Spring RestTemplate 的介绍和使用-入门

    RestTemplate是什么? 传统情况下在java代码里访问restful服务,一般使用Apache的HttpClient.不过此种方法使用起来太过繁琐.spring提供了一种简单便捷的模板类来进 ...

  9. Spring RestTemplate 之get请求

    一,简介:Spring RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写 ...

  10. 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 ...

随机推荐

  1. w3cschool-XML教程

    参考https://www.w3cschool.cn/xml/ XML 教程 让我们先来简单的了解一下 XML: XML 指可扩展标记语言(eXtensible Markup Language). X ...

  2. selenium等待的三种方式(详细)

    1.强制等待 time.sleep(3) 这种方式会是操作强行等待3s才会进行下一步操作,但是这种放法,可能会延长测试的时间,如果元素在1s中出现,就会浪费2s的时间,并且这种放法单次有效,每次需要等 ...

  3. Spring,Spring Ioc,Bean详解

    Spring框架 Spring框架是Java应用最广的框架,其的成功来自于理念,并非是技术,其中几个理念非常重要,例如IoC(控制反转),AOP(面向切面编程) Spring的优势 低耦合/低侵入(解 ...

  4. JavaScript 事件绑定:立即执行函数的闭包 vs let的块作用域

    以下两个写法,在执行时是等价的: // 立即执行函数表达式写法 var btns_var = document.getElementsByTagName('button'); for(var i = ...

  5. moectf2023 web wp

    gas!gas!gas! 直接跑脚本 import requests session=requests.Session() url="http://127.0.0.1:14447" ...

  6. 天翼云加速落地紫金DPU实践应用,让算力供给更高效!

    近日,以"智驱创新·芯动未来"为主题的第三届DPU峰会在北京成功举办.会上,天翼云凭借紫金DPU在架构革新.算力释放.场景落地等多方面的成果,荣膺"2023芯星品牌奖&q ...

  7. Alink漫谈(二十一) :回归评估之源码分析

    Alink漫谈(二十一) :回归评估之源码分析 0x00 摘要 Alink 是阿里巴巴基于实时计算引擎 Flink 研发的新一代机器学习算法平台,是业界首个同时支持批式算法.流式算法的机器学习平台.本 ...

  8. 多个tomcat启停脚本server.sh

    vi server.sh #!/bin/bash export JAVA_HOME=/u01/java_home/jdk1.8.0_181 export JRE_HOME=${JAVA_HOME}/j ...

  9. IDEA中Maven项目修改JSP后通过配置Tomcat实现立即生效

    参考: IntelliJ IDEA 的 Project Structure 窗口中的 Artifacts 勾选 Include in project build IDEA中Facets和Artifac ...

  10. 支付宝 IoT 设备入门宝典(上)设备管理篇

    相信不少朋友最近都被支付宝"碰一下"广告刷屏,"不用打开APP 支付就碰一下"几个字一出简直自带BGM--其实"碰一下"就是支付宝 IoT ...