SpringBoot圖文教程17—上手就會 RestTemplate 使用指南「Get Post」「設定請求頭」
阿新 • • 發佈:2020-03-21
![](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 獲取響應的資料,響應的狀態碼等資訊
*/
Respon