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