RestTemplate get請(qǐng)求攜帶headers自動(dòng)拼接參數(shù)方式
RestTemplate get請(qǐng)求攜帶headers自動(dòng)拼接參數(shù)
/**
* 根據(jù)get方式請(qǐng)求接口
* @param url
* @param map
* @param restTemplate
* @return
*/
public static JSONObject requestByGet(String url,HashMap<String,Object> map, RestTemplate restTemplate,HttpHeaders headers){
// header填充
HttpEntity<MultiValueMap<String,Object>> request = new HttpEntity(null,headers);
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
ResponseEntity responseEntity;
//如果存在參數(shù)
if(!map.isEmpty()){
for (Map.Entry<String,Object> e:
map.entrySet()) {
//構(gòu)建查詢參數(shù)
builder.queryParam(e.getKey(),e.getValue());
}
//拼接好參數(shù)后的URl//test.com/url?param1={param1}¶m2={param2};
String reallyUrl=builder.build().toString();
responseEntity =restTemplate.exchange(reallyUrl,HttpMethod.GET,request,String.class);
}else{
responseEntity=restTemplate.exchange(url,HttpMethod.GET,request,String.class);
}
return getJSONObjectForResponseEntity(responseEntity);
}RestTemplate請(qǐng)求參數(shù)傳遞問(wèn)題
問(wèn)題
使用RestTemplate傳遞參數(shù)的時(shí)候,RestTemplate默認(rèn)傳遞的是json格式,將參數(shù)放在請(qǐng)求體中,這就導(dǎo)致使用@RequestParam接收不到參數(shù)。下面測(cè)試集中參數(shù)傳遞的方式
測(cè)試方法
- 1.先重現(xiàn)錯(cuò)誤,使用RestTemplate傳遞json,同時(shí)使用@RequestParam接收參數(shù).
- 2.更改RestTemplate參數(shù)傳遞方式,將參數(shù)使用占位符在請(qǐng)求行拼接.
- 3.測(cè)試使用@RequestBody接收請(qǐng)求體中的數(shù)據(jù)(對(duì)象/集合/字符串/json數(shù)據(jù)).
測(cè)試
構(gòu)造幾個(gè)接口
/**
* 測(cè)試restTemplate的數(shù)組型(List)數(shù)據(jù)的傳遞
*/
@RestController
public class UserController {
/**
* 接收一個(gè)json格式的字符串 數(shù)組轉(zhuǎn)換為json字符串傳遞
*/
@RequestMapping(value = "/test01")
public String getRest01(@RequestParam("userList")String userList) {
//轉(zhuǎn)為list
List<User> userList1 = JSONArray.parseArray(userList, User.class);
for (User user : userList1) {
System.out.println(user);
}
return "11111111111";
}
/**
* 測(cè)試直接傳遞單個(gè)對(duì)象
*/
@RequestMapping(value = "/test02")
public String getRest02(@RequestBody User user) {
System.out.println(user);
return "2222222222222";
}
/**
*測(cè)試使用list<>接收數(shù)組型的參數(shù)
*/
@RequestMapping(value = "/test03")
public String getRest03(@RequestBody List<User> userList) {
System.out.println(userList);
return "333333333333";
}
/**
* 使用String 接收請(qǐng)求體中數(shù)據(jù)
*/
@RequestMapping(value = "/test04")
public String getRest04(@RequestBody String userList) {
//轉(zhuǎn)為list
List<User> userList1 = JSONArray.parseArray(userList, User.class);
for (User user : userList1) {
System.out.println(user);
}
return "444444444444444";
}
/**
* 使用JSONArray接收請(qǐng)求體中的數(shù)據(jù)
*/
@RequestMapping(value = "/test05")
public String getRest05(@RequestBody JSONArray jsonArray, HttpServletRequest request) {
//獲取請(qǐng)求頭中的數(shù)據(jù)
String key = request.getHeader("key");
System.out.println(key);
//轉(zhuǎn)為list
List<User> userList = JSONArray.parseArray(jsonArray.toJSONString(), User.class);
for (User user : userList) {
System.out.println(user);
}
return "55555555555555";
}
}使用單元測(cè)試測(cè)試接口
class ApplicationTests {
private RestTemplate restTemplate = new RestTemplate();
//構(gòu)建兩個(gè)使用的對(duì)象并使用list封裝起來(lái)
private List<User> userList = new ArrayList<>();
private User oneUser;
private User twoUser;
{
//第一個(gè)對(duì)象
oneUser = new User();
oneUser.setName("第一個(gè)用戶");
oneUser.setAge("第一個(gè)年齡");
oneUser.setAddress("第一個(gè)地址");
//第二個(gè)對(duì)象
twoUser = new User();
twoUser.setName("22222222第二個(gè)用戶");
twoUser.setAge("2222222第二個(gè)年齡");
twoUser.setAddress("222222第二個(gè)地址");
//添加進(jìn)list
userList.add(oneUser);
userList.add(twoUser);
}
/*
* 當(dāng)服務(wù)端使用@RequestParam("tableList")String tableList這種方式時(shí)
* 方法異常:HttpClientErrorException$BadRequest: 400 Bad Request
* 原因:無(wú)法使用@RequestParam識(shí)別參數(shù)中的json格式的
* */
@Test
void test01() {
String url = "http://127.0.0.1:8080/test01";
//json格式的字符串
String jsonString = JSON.toJSONString(userList);
Map<String, String> map = new HashMap<>();
map.put("userList", jsonString);
String s = restTemplate.postForObject(url, map, String.class);
System.out.println(s);
}
/*
* 當(dāng)服務(wù)端使用@RequestParam("tableList")String tableList這種方式時(shí),改請(qǐng)求方式會(huì)成功
* 改變:使用了postForEntity方法(這個(gè)方法可以傳遞更多的請(qǐng)求信息,比如請(qǐng)求頭等)
* 使用的占位符的方式拼接json字符串, 在第一個(gè)方法參數(shù)中,最后的參數(shù)Object...是一個(gè)可變形參,可以傳遞多個(gè)參數(shù),位置從1開(kāi)始
* 原因:restTemplate默認(rèn)的是json格式的參數(shù),會(huì)在請(qǐng)求體中放著數(shù)據(jù),而@RequestParam只能獲取請(qǐng)求行中的參數(shù)
* 將參數(shù)改在請(qǐng)求行發(fā)送就能接收到了.
* */
@Test
void test02() {
//使用占位符的方式
String url = "http://127.0.0.1:8080/test01?userList={1}";
String jsonString = JSON.toJSONString(userList);
//使用占位符拼接參數(shù)
//連接(帶有占位符的) / HttpEntity對(duì)象(暫時(shí)不用,后邊會(huì)有) / 返回值 / 拼接的數(shù)據(jù)
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, null, String.class, jsonString);
System.out.println(responseEntity.toString());
}
/*
* 當(dāng)服務(wù)端使用(@RequestBody User user)這種方式時(shí),會(huì)成功
* @RequestBody 將會(huì)從請(qǐng)求體(body)中取數(shù)據(jù),此時(shí)可以取到已經(jīng)轉(zhuǎn)為json格式的User對(duì)象(resttemplate會(huì)自動(dòng)轉(zhuǎn))
* 但是當(dāng)傳遞的是數(shù)組型的數(shù)據(jù)時(shí)(List),服務(wù)端又改怎么樣接收呢,使用test04測(cè)試一下.
* */
@Test
void test03() {
//使用服務(wù)端的test02接口
String url = "http://127.0.0.1:8080/test02";
//測(cè)試只傳遞一個(gè)對(duì)象, 使用httpEntity來(lái)封裝一下對(duì)象.
HttpEntity<User> httpEntity = new HttpEntity<>(oneUser);
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, httpEntity, String.class);
System.out.println(responseEntity.toString());
}
/*
* 傳遞的是數(shù)組型的數(shù)據(jù)的時(shí)候,服務(wù)端可以使用List<>這種形式來(lái)接收,也會(huì)成功
* */
@Test
void test04() {
//使用服務(wù)端的test03接口,用list<>接收
String url = "http://127.0.0.1:8080/test03";
//測(cè)試傳遞一個(gè)list對(duì)象
HttpEntity<List<User>> httpEntity = new HttpEntity<>(userList);
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, httpEntity, String.class);
System.out.println(responseEntity.toString());
}
/*
* 傳遞的是數(shù)組型的數(shù)據(jù)的時(shí)候,服務(wù)端也可以使用String來(lái)接收json型的數(shù)據(jù)
* */
@Test
void test05() {
//使用服務(wù)端的test04接口,用String接收
String url = "http://127.0.0.1:8080/test04";
//測(cè)試傳遞一個(gè)list對(duì)象
HttpEntity<List<User>> httpEntity = new HttpEntity<>(userList);
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, httpEntity, String.class);
System.out.println(responseEntity.toString());
}
/*
* 傳遞的是數(shù)組型的數(shù)據(jù)的時(shí)候,服務(wù)端也可以使用JsonArray來(lái)接收
* */
@Test
void test06() {
//使用服務(wù)端的test04接口,用JsonArray接收
String url = "http://127.0.0.1:8080/test05";
//傳遞的參數(shù)的同時(shí),自定義請(qǐng)求頭
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.set("key","value");
HttpEntity<List<User>> httpEntity = new HttpEntity<>(userList,httpHeaders);
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, httpEntity, String.class);
System.out.println(responseEntity.toString());
}
/*
* 總結(jié)一下:
* 使用RestTemplate遠(yuǎn)程調(diào)用接口的時(shí)候,會(huì)默認(rèn)將數(shù)據(jù)放在請(qǐng)求體中(body)
* 而使用@RequestBody才能接收請(qǐng)求體中的數(shù)據(jù).
* @RequestParam只能接收請(qǐng)求行中的參數(shù)
* 根據(jù)位置選擇使用的注解
*
* postForEntity 方法可以自定義請(qǐng)求頭,以及進(jìn)行請(qǐng)求行的參數(shù)拼接,功能全
* */
}
心得
使用RestTemplate遠(yuǎn)程調(diào)用接口的時(shí)候,會(huì)默認(rèn)將數(shù)據(jù)放在請(qǐng)求體中(body)
使用@RequestBody才能接收請(qǐng)求體中的數(shù)據(jù).
@RequestParam只能接收請(qǐng)求行中的
服務(wù)端應(yīng)該根據(jù)參數(shù)位置選擇使用的注解
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 關(guān)于RestTemplate中的Get請(qǐng)求
- RestTemplate調(diào)用POST和GET請(qǐng)求示例詳解
- RestTemplate Get請(qǐng)求實(shí)現(xiàn)bean參數(shù)傳遞詳解
- RestTemplate發(fā)送HTTP?GET請(qǐng)求使用方法詳解
- RestTemplate實(shí)現(xiàn)發(fā)送帶headers的GET請(qǐng)求
- spring boot RestTemplate 發(fā)送get請(qǐng)求的踩坑及解決
- 解決RestTemplate 的getForEntity調(diào)用接口亂碼的問(wèn)題
- RestTemplate發(fā)送get和post請(qǐng)求,下載文件的實(shí)例
相關(guān)文章
java8學(xué)習(xí)教程之lambda表達(dá)式的使用方法
Java8最值得學(xué)習(xí)的特性就是Lambda表達(dá)式,下面這篇文章主要給大家介紹了關(guān)于java8學(xué)習(xí)教程之lambda表達(dá)式使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09
2022?最新?IntelliJ?IDEA?詳細(xì)配置步驟演示(推薦)
作為一名開(kāi)發(fā)人員,第一肯定是選擇一款趁手的開(kāi)發(fā)利器,本人使用?Java?偏多,這里推薦使用?IntelliJ?IDEA,?俗稱神級(jí)開(kāi)發(fā)工具,具體的安裝過(guò)程就不過(guò)多贅述了,有需要了解的朋友可以參考下本文2022-09-09
JAVA SpringBoot jar程序 Systemctl生產(chǎn)環(huán)境部署方案
這篇文章主要介紹了JAVA SpringBoot jar程序 Systemctl生產(chǎn)環(huán)境部署方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
IDEA2022創(chuàng)建Maven Web項(xiàng)目教程(圖文)
本文主要介紹了IDEA2022創(chuàng)建Maven Web項(xiàng)目教程,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Mybatis-Plus使用@TableField實(shí)現(xiàn)自動(dòng)填充日期的代碼示例
數(shù)據(jù)庫(kù)中經(jīng)常有create_time,update_time兩個(gè)字段,在代碼中設(shè)置時(shí)間有點(diǎn)太麻煩了?mybatis-plus可以幫我們自動(dòng)填充,本文主要介紹了Mybatis-Plus使用@TableField實(shí)現(xiàn)自動(dòng)填充日期的代碼示例,感興趣的可以了解一下2022-04-04
SpringBoot項(xiàng)目中Controller接收兩個(gè)實(shí)體的實(shí)現(xiàn)方法
本文主要介紹了SpringBoot項(xiàng)目中Controller接收兩個(gè)實(shí)體的實(shí)現(xiàn)方法,主要介紹了兩種方法,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08
SpringBoot中@Autowired 失效及@Autowired 注入為null的解決
在SpringBoot項(xiàng)目中,@Autowired注解用于自動(dòng)注入依賴,但有時(shí)會(huì)注入失敗導(dǎo)致空指針異常,下面就來(lái)介紹一下如何解決,感興趣的可以了解一下2024-09-09
基于SpringBoot接口+Redis解決用戶重復(fù)提交問(wèn)題
當(dāng)網(wǎng)絡(luò)延遲的情況下用戶多次點(diǎn)擊submit按鈕導(dǎo)致表單重復(fù)提交,用戶提交表單后,點(diǎn)擊瀏覽器的【后退】按鈕回退到表單頁(yè)面后進(jìn)行再次提交也會(huì)出現(xiàn)用戶重復(fù)提交,辦法有很多,我這里只說(shuō)一種,利用Redis的set方法搞定,需要的朋友可以參考下2023-10-10

