SpringBoot图文教程17—上手就会 RestTemplate 使用指南「Get Post」「设置请求头」
鹿老师的Java笔记 人气:0
![](https://img2020.cnblogs.com/other/1003051/202003/1003051-20200320211029269-1539461491.png)
> **有天上飞的概念,就要有落地的实现**
>
> - 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍
>
> - 先赞后看,养成习惯
**SpringBoot 图文教程系列文章目录**
1. [SpringBoot图文教程1—SpringBoot+Mybatis 环境搭建](https://mp.weixin.qq.com/s/phk6j3ChBP-kPtS2xZeEZg)
2. [SpringBoot图文教程2—日志的使用「logback」「log4j」](https://mp.weixin.qq.com/s/7Mw_xhFF4Q5NtdtcsHc67Q)
3. [SpringBoot图文教程3—「‘初恋’情结」集成Jsp](https://mp.weixin.qq.com/s/BYzVg5NBcF_ou_PyX8ygag)
4. [SpringBoot图文教程4—SpringBoot 实现文件上传下载](https://mp.weixin.qq.com/s/6ctykPo3eDBEB7YsC0PAZw)
5. [SpringBoot图文教程5—SpringBoot 中使用Aop](https://mp.weixin.qq.com/s/17qMRlv_mUfwkcVD05Bh2g)
6. [SpringBoot图文教程6—SpringBoot中过滤器的使用](https://mp.weixin.qq.com/s/r2BO4UMNRAw_REA6nNFLKw)
7. [SpringBoot图文教程7—SpringBoot拦截器的使用姿势这都有](https://mp.weixin.qq.com/s/YpDhuOTpt1vjYjnhnK8YdQ)
8. [SpringBoot图文教程8—SpringBoot集成MBG「代码生成器」](https://mp.weixin.qq.com/s/uGYO4fkw03Kxpfp_PIA8rQ)
9. [SpringBoot图文教程9—SpringBoot 导入导出 Excel 「Apache Poi」](https://mp.weixin.qq.com/s/BXfxhO5rFFg6XZQ0rZgGMg)
10. [SpringBoot图文教程10—模板导出|百万数据Excel导出|图片导出「easypoi」](https://mp.weixin.qq.com/s/8Yqfn27UCFP2lU3_IYb5AQ)
11. [SpringBoot图文教程11—从此不写mapper文件「SpringBoot集成MybatisPlus」](https://mp.weixin.qq.com/s/8KG5Wj77MYEUCIRFqWBdPQ)
12. [SpringBoot图文教程12—SpringData Jpa的基本使用](https://mp.weixin.qq.com/s/gPfSjBj1hMWf23J50d5Z_g)
13. [SpringBoot图文教程13—SpringBoot+IDEA实现代码热部署](https://mp.weixin.qq.com/s/DYP_12V01D0NJGEBdwK9Ew)
14. [SpringBoot图文教程14—阿里开源EasyExcel「为百万数据读写设计」](https://mp.weixin.qq.com/s/FNuL3maNtiFCVR7hREYpLA)
15. [SpringBoot图文教程15—项目异常怎么办?「跳转404错误页面」「全局异常捕获」](https://mp.weixin.qq.com/s/O97_ZqoUCl5fICXHbSCf2Q)
16. [SpringBoot图文教程16—SpringBoot 多模块开发「web」「打包」](https://mp.weixin.qq.com/s/CDWnG0wr6hk6TvDYIELIaQ)
## 前言
问个问题:通过Java代码怎么发送Http请求,请求另一个Java程序的Controller方法呢?
![](https://img2020.cnblogs.com/other/1003051/202003/1003051-20200320211030558-449919758.png)
好像真的有点触及到知识盲区了呦
在以前的代码中,Java程序都是被请求的一方,发送请求的要么是Ajax,要么是浏览器,要么是postman等,今天就来一起学习一下如何通过Java代码发送Http请求。
## RestTemplate 的使用
![](https://img2020.cnblogs.com/other/1003051/202003/1003051-20200320211032680-2015702649.png)
### 准备工作「可以跳过,不影响教程学习」
因为我们要通过RestTemplate发送请求,请求另外一个项目的Controller层方法(接口),所以我们首先需要一个被请求的项目。
关于这个项目,我已经搭建好了,码云地址为:https://gitee.com/bingqilinpeishenme/boot-demo/tree/master/boot-base-rest
在项目中有三个方法,分别是测试Get请求和Post请求如下
```
package com.lby.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
/**
* @author luxiaoyang
* @create 2020-03-18-20:02
*/
@Controller
public class TestController {
/**
* @GetMapping("testRestGet") 当前方法只接受Get请求
* 等价于
* @RequestMapping(path = "testRestGet",method = RequestMethod.GET)
*/
@GetMapping("testRestGet")
@ResponseBody
public String testRestGet(String username){
return "这是一个Get请求,接受参数:"+username;
}
/**
* @PostMapping("") 当前方法只接受Post请求
* 等价于
* @RequestMapping(path = "testRestPost",method = RequestMethod.POST)
*/
@PostMapping("testRestPost")
@ResponseBody
public String testRestPost(String username){
return "这是一个Post请求,接受参数:"+username;
}
/**
* 测试 postForLocation 给RestTemplate响应url地址
*/
@PostMapping("testRestPostLocation")
public String testRestPostLocation(String username){
System.out.println(username);
return "redirect:/success.html";
}
}
```
### 什么是RestTemplate
**Spring中封装的通过Java代码发送RestFul请求的模板类,内置发送get post delete等请求的方法**,在SpringBoot中只要导入spring-boot-starter-web的依赖可以直接使用。
### 快速开始
确定项目中导入spring-boot-starter-web的依赖。
**第一步:配置RestTemplate**
![](https://img2020.cnblogs.com/other/1003051/202003/1003051-20200320211033651-239113789.png)
```
/**
* RestTemplate配置
*/
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
return new RestTemplate(factory);
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
// 超时设置
factory.setReadTimeout(5000);//ms
factory.setConnectTimeout(15000);//ms
return factory;
}
}
```
**第二步:直接使用RestTemplate的Api发送请求**
这一步,我们直接在测试类中发送Get方式的请求,进行简单的测试,感受到效果之后,再进行更多API深入的学习。
```
package com.lby;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.web.client.RestTemplate;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {BootResttemplateApplication.class})
public class BootResttemplateApplicationTests {
@Autowired
private RestTemplate restTemplate;
/**
* 测试get请求
*/
@Test
public void test1(){
/**
* getForObject
*
* 参数1 要请求的地址的url 必填项
* 参数2 响应数据的类型 是String 还是 Map等 必填项
* 参数3 请求携带参数 选填
*
* getForObject 方法的返回值就是 被调用接口响应的数据
*/
String result = restTemplate.getForObject("http://localhost:8802/product/showProductById?id=1", String.class);
System.out.println(result);
}
}
```
### RestTemplate的主要API
| HTTP Method | RestTemplate Methods |
| --- | --- |
| Get | getForObject, getForEntity |
| Post | postForEntity, postForObject, postForLocation |
| PUT | put |
| any | exchange, execute
|
| DELETE | delete |
| HEAD | headForHeaders |
| OPTIONS | optionsForAllow |
以上是RestTemplate的主要API,其中大部分的API会在后续的代码中详细讲解。
### Get请求的所有使用方式
Get请求方式:
1. url拼接参数
2. url拼接参数「占位符的方式」
3. 获取响应实体对象「响应状态码」
```
/**
* 测试get请求
*/
@Test
public void test1(){
/**
* getForObject
*
* 参数1 要请求的地址的url 必填项
* 参数2 响应数据的类型 是String 还是 Map等 必填项
* 参数3 请求携带参数 选填
*
* getForObject 方法的返回值就是 被调用接口响应的数据
*/
String result = restTemplate.getForObject("http://localhost:8802/testRestGet?username=zhangsan", String.class);
System.out.println(result);
/**
* getForEntity 方法
* 参数1 要请求的地址的url 必填项
* 参数2 响应数据的类型 是String 还是 Map等 必填项
* 参数3 请求携带参数 选填
*
* 返回值类型为 ResponseEntity
*
* 可以通过ResponseEntity 获取响应的数据,响应的状态码等信息
*/
ResponseEntity
加载全部内容