Spring RestTemplate基本使用介紹
上篇文件介紹Eureka服務(wù)的文章中,我們介紹到consumer從Eureka中通過(guò)LoadBalancerClient獲取到服務(wù)端地址信息后通過(guò)RestTemplate來(lái)遠(yuǎn)程調(diào)用服務(wù)的場(chǎng)景,本文來(lái)具體介紹下RestTemplate的使用
RestTemplate
SpringRestTemplate是Spring 提供的用于訪問(wèn) Rest 服務(wù)的客端, RestTemplate提供了多種便捷訪問(wèn)遠(yuǎn)程Http服務(wù)的方法,能夠大大提高客戶端的編寫效率,所以很多客戶端比如Android或者第三方服務(wù)商都是使用RestTemplate 請(qǐng)求 restful服務(wù)
1.環(huán)境搭建
為了演示RestTemplate的使用,我們創(chuàng)建兩個(gè)SpringBoot項(xiàng)目,一個(gè)provider作為server端,一個(gè)consumer作為服務(wù)調(diào)用方法

2.API方法介紹
| API | 說(shuō)明 |
|---|---|
| getForEntity() | 發(fā)送一個(gè)HTTP GET請(qǐng)求,返回的ResponseEntity包含了響應(yīng)體所映射成的對(duì)象 |
| getForObject() | 發(fā)送一個(gè)HTTP GET請(qǐng)求,返回的請(qǐng)求體將映射為一個(gè)對(duì)象 |
| postForEntity() | POST 數(shù)據(jù)到一個(gè)URL,返回包含一個(gè)對(duì)象的ResponseEntity,這個(gè)對(duì)象是從響應(yīng)體中映射得到的 |
| postForObject() | POST 數(shù)據(jù)到一個(gè)URL,返回根據(jù)響應(yīng)體匹配形成的對(duì)象 |
| headForHeaders() | 發(fā)送HTTP HEAD請(qǐng)求,返回包含特定資源URL的HTTP頭 |
| optionsForAllow() | 發(fā)送HTTP OPTIONS請(qǐng)求,返回對(duì)特定URL的Allow頭信息 |
| postForLocation() | POST 數(shù)據(jù)到一個(gè)URL,返回新創(chuàng)建資源的URL |
| put() | PUT 資源到特定的URL |
| delete() | 在特定的URL上對(duì)資源執(zhí)行HTTP DELETE操作 |
| exchange() | 在URL上執(zhí)行特定的HTTP方法,返回包含對(duì)象的ResponseEntity,這個(gè)對(duì)象是從響應(yīng)體中映射得到的 |
| execute() | 在URL上執(zhí)行特定的HTTP方法,返回一個(gè)從響應(yīng)體映射得到的對(duì)象 |
3.具體使用
我們通過(guò)常用的http協(xié)議的四種請(qǐng)求方式來(lái)看下效果
3.1 無(wú)參請(qǐng)求
我們先來(lái)看下服務(wù)端請(qǐng)求方法不需要接收參數(shù),
getForEntity
通過(guò)getForEntity來(lái)實(shí)現(xiàn)
服務(wù)端
/**
* 無(wú)參,返回字符串
* @return
*/
@GetMapping("/server1")
public String server1String(){
System.out.println("服務(wù)端被訪問(wèn)了...");
return "success";
}
調(diào)用
/**
* RestTemplate 訪問(wèn) provider的第一個(gè)服務(wù) server1
*/
@Test
public void contextLoads() {
String url = "http://localhost:8080/server1";
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> entity = restTemplate.getForEntity(url, String.class);
// 獲取響應(yīng)的狀態(tài)
HttpStatus statusCode = entity.getStatusCode();
// 獲取響應(yīng)的header信息
HttpHeaders headers = entity.getHeaders();
// 獲取響應(yīng)的body信息
String msg = entity.getBody();
System.out.println(statusCode);
System.out.println(headers);
System.out.println(msg);
}
輸出結(jié)果

說(shuō)明:
1.getForEntity()方法執(zhí)行返回的類型是ResponseEntity<T>,ResponseEntity<T>是Spring對(duì)HTTP請(qǐng)求響應(yīng)的封裝,包括了幾個(gè)重要的元素,如響應(yīng)碼、contentType、contentLength、響應(yīng)消息體等,在輸出結(jié)果中我們能夠看到
2.getForEntity()的參數(shù)中第一個(gè)是請(qǐng)求地址,第二個(gè)是T對(duì)應(yīng)的類型
getForObject
getForObject函數(shù)實(shí)際上是對(duì)getForEntity函數(shù)的進(jìn)一步封裝,如果你只關(guān)注返回的消息體的內(nèi)容,對(duì)其他信息都不關(guān)注,此時(shí)可以使用getForObject
/**
* getForObject 訪問(wèn)
*/
@Test
public void contextLoadsObject() {
String url = "http://localhost:8080/server1";
RestTemplate restTemplate = new RestTemplate();
// 直接返回的就是我們需要的結(jié)果,但是獲取不到對(duì)應(yīng)的響應(yīng)狀態(tài)等信息
String msg = restTemplate.getForObject(url,String.class);
System.out.println(msg);
}
3.2 有參請(qǐng)求
服務(wù)端方法需要接收調(diào)用者傳遞的參數(shù)
/**
* 有參,基本數(shù)據(jù)類型 返回字符串
* @return
*/
@RequestMapping("/server2")
public String server2String(Integer id,String userName){
System.out.println("服務(wù)端被訪問(wèn)了..."+id+" "+userName);
return "success--參數(shù)得到了";
}
/**
* 有參,基本數(shù)據(jù)類型 返回字符串
* @return
*/
@RequestMapping("/server3")
public String server3String(User user){
System.out.println("服務(wù)端被訪問(wèn)了..."+user);
return "success--參數(shù)得到了";
}
getForEntity
調(diào)用者可以通過(guò)兩種方式調(diào)用
第一種方式通過(guò)數(shù)字占位符,最后是一個(gè)可變長(zhǎng)度的參數(shù),來(lái)一一替換前面的占位符
/**
* 請(qǐng)求服務(wù)并且傳遞參數(shù)
* 基本數(shù)據(jù)類型
*/
@Test
public void testServer2(){
// 參數(shù)在鏈接地址后
String url = "http://localhost:8080/server2?id={1}&userName={2}";
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> entity = restTemplate.getForEntity(url, String.class,5,"bobo");
System.out.println(entity.getBody());
}
第二種就是使用name={name}這種形式,最后一個(gè)參數(shù)是一個(gè)map,map的key即為前邊占位符的名字,map的value為參數(shù)值
/**
* 請(qǐng)求服務(wù)并且傳遞參數(shù)
* 基本數(shù)據(jù)類型
*/
@Test
public void testServer3(){
String url = "http://localhost:8080/server2?id={id}&userName={userName}";
Map<String,Object> map = new HashMap<>();
map.put("id",6);
map.put("userName","波波烤鴨");
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> entity = restTemplate.getForEntity(url, String.class,map);
System.out.println(entity.getBody());
}
postForEntity
如果是post方式提交請(qǐng)求傳遞參數(shù)我們可以這樣使用,如下
服務(wù)端:注意要加@RequestBody注解
/**
* 有參,基本數(shù)據(jù)類型 返回字符串
* @return
*/
@RequestMapping("/server3")
public String server3String(@RequestBody User user){
System.out.println("服務(wù)端被訪問(wèn)了..."+user);
return "success--參數(shù)得到了";
}
客戶端
/**
* postForEntity(url,user,String.class)
* url:請(qǐng)求地址
* user:請(qǐng)求提交的數(shù)據(jù)
* String.class 接收返回?cái)?shù)據(jù)的類型
*/
@Test
public void contextLoadsObject1() {
String url = "http://localhost:8080/server3";
RestTemplate restTemplate = new RestTemplate();
User user = new User(1,"bobo","中國(guó)");
// 直接返回的就是我們需要的結(jié)果,但是獲取不到對(duì)應(yīng)的響應(yīng)狀態(tài)等信息
String msg = restTemplate.postForEntity(url,user,String.class).getBody();
System.out.println(msg);
}
3.3 返回自己類型
服務(wù)端返回的我們自定義類型的數(shù)據(jù)
/**
* 返回自定義對(duì)象
* @return
*/
@RequestMapping("/server4")
public User server4Object(){
System.out.println("服務(wù)端被訪問(wèn)了...");
return new User(2,"李四","深圳");
}
客戶端:
/**
* 返回類型為自定義類型
*/
@Test
public void testServer5(){
String url = "http://localhost:8080/server4";
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<User> entity = restTemplate.getForEntity(url, User.class);
System.out.println(entity.getBody());
}
使用getForEntity和getForObject及postForEntity和postForObject都差不多,注意接收的類型即可。
3.4 返回的list帶泛型的場(chǎng)景
此處我們需要使用到exchange方法,特定如下
- 允許調(diào)用者指定HTTP請(qǐng)求的方法(GET,POST,PUT等)
- 可以在請(qǐng)求中增加body以及頭信息,其內(nèi)容通過(guò)參‘HttpEntity<?>requestEntity'描述
- exchange支持‘含參數(shù)的類型'(即泛型類)作為返回類型,該特性通過(guò)‘ParameterizedTypeReferenceresponseType'描述
客戶端調(diào)用
/**
* 返回 集合帶泛型
* @return
*/
@RequestMapping("/server5")
public List<User> server5List(){
System.out.println("服務(wù)端被訪問(wèn)了...");
return Arrays.asList(new User(2,"李四1","深圳")
,new User(3,"李四2","深圳")
,new User(4,"李四3","深圳"));
}

好了~RestTemplate的基本使用我們就介紹到此處,更多相關(guān)Spring RestTemplate使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java多線程之鎖的強(qiáng)化學(xué)習(xí)
Java多線程的鎖都是基于對(duì)象的,Java中的每一個(gè)對(duì)象都可以作為一個(gè)鎖。這篇文章主要來(lái)通過(guò)一下示例為大家強(qiáng)化一下鎖的相關(guān)知識(shí)的掌握,希望對(duì)大家有所幫助2023-02-02
關(guān)于JSON解析中獲取不存在的key問(wèn)題
這篇文章主要介紹了關(guān)于JSON解析中獲取不存在的key問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
快速解決List集合add元素,添加多個(gè)對(duì)象出現(xiàn)重復(fù)的問(wèn)題
這篇文章主要介紹了快速解決List集合add元素,添加多個(gè)對(duì)象出現(xiàn)重復(fù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
手動(dòng)添加jar包進(jìn)Maven本地庫(kù)內(nèi)的方法
這篇文章主要介紹了手動(dòng)添加jar包進(jìn)Maven本地庫(kù)內(nèi)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Spring init-method與destroy-method屬性的用法解析
這篇文章主要介紹了Spring init-method與destroy-method屬性的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Mybatis開(kāi)發(fā)要點(diǎn)-resultType和resultMap有什么區(qū)別詳解
本文主要介紹了Mybatis開(kāi)發(fā)要點(diǎn)-resultType和resultMap有什么區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
Java8 使用 stream().sorted()對(duì)List集合進(jìn)行排序的操作
這篇文章主要介紹了Java8 使用 stream().sorted()對(duì)List集合進(jìn)行排序的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
springboot的切面應(yīng)用方式(注解Aspect)
文章總結(jié):Spring?Boot提供了三種攔截器:Filter、Interceptor和Aspect,Filter主要用于內(nèi)容過(guò)濾和非登錄狀態(tài)的非法請(qǐng)求過(guò)濾,無(wú)法獲取Spring框架相關(guān)的信息,Interceptor可以在獲取請(qǐng)求類名、方法名的同時(shí),獲取請(qǐng)求參數(shù),但無(wú)法獲取參數(shù)值2024-11-11

