springboot中RestTemplate發(fā)送HTTP請(qǐng)求的實(shí)現(xiàn)示例
一、前言
之前對(duì)發(fā)送http請(qǐng)求,使用過(guò)okhttp,還有httpclient等,這次就直接使用springboot的RestTemplate了。
二、不同的請(qǐng)求方式
我這里只針對(duì)POST請(qǐng)求做說(shuō)明:
下面針對(duì)post請(qǐng)求做三種說(shuō)明:
1、調(diào)用的接口參數(shù)用@RequestParam標(biāo)識(shí)
此種在APIfox中傳參方式是地址欄傳參數(shù),沒(méi)有請(qǐng)求體。
/** * 發(fā)送沒(méi)有請(qǐng)求體的請(qǐng)求 * @param url 請(qǐng)求url * @param reqParam 地址欄參數(shù) * @return 想要結(jié)果 */ public static JSONObject httpPostResult(String url, Map<String, Object> reqParam) { String params = getParameter(reqParam); if (StringUtils.isBlank(params)) { log.error("獲取sign失敗,sign=null"); return null; } HttpEntity<Map<String, String>> httpEntity = new HttpEntity<>(setHeaders()); //解析請(qǐng)求結(jié)果 String result = new RestTemplate().postForObject(url + params, httpEntity, String.class); return JSONObject.parseObject(result); } /** * 對(duì)地址欄的參數(shù)進(jìn)行拼接 * @param map 地址欄參數(shù) * @return 拼接后的結(jié)果 */ public static String getParameter(Map<String, Object> map) { try { if (MapUtil.isEmpty(map)) { return null; } String result = ""; for (String key : map.keySet()) { if (Objects.nonNull(map.get(key) )) { if (!"".equals(result)) { result += "&"; } result = result + key + "=" + map.get(key); } } return result; } catch (Exception e) { log.error("map轉(zhuǎn)參出錯(cuò)", e); } return null; } /** * 設(shè)置請(qǐng)求頭 * @return 請(qǐng)求頭 */ private static HttpHeaders setHeaders() { HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.add("Accept", MediaType.APPLICATION_JSON.toString()); httpHeaders.add("Accept-Charset", "UTF-8"); return httpHeaders; }
在Apifox中調(diào)用如下:
請(qǐng)求體body=none。
對(duì)應(yīng)的curl命令如下:
curl --location --request POST 'http://xxx:8080/tree/getTree?param1=abc¶m2=123¶m3=def' \
2、調(diào)用的接口參數(shù)用@RequestBody標(biāo)識(shí)
此種在APIfox中傳參方式是地址欄需要傳參數(shù),且有請(qǐng)求體。
/** * 發(fā)送帶有地址欄參數(shù),有請(qǐng)求體的請(qǐng)求 * @param url 請(qǐng)求 url * @param reqParam url上的參數(shù) * @param reqBody 請(qǐng)求體 * @return 響應(yīng)結(jié)果 */ public static JSONObject httpPostResult(String url, Map<String, Object> reqParam, Map<String, Object> reqBody) { String params = getParameter(reqParam); if (StringUtils.isBlank(params)) { log.error("獲取sign失敗,sign=null"); return null; } //封裝請(qǐng)求頭和內(nèi)容 HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(reqBody, setHeaders()); //解析請(qǐng)求結(jié)果 String result = new RestTemplate().postForObject(url + params, requestEntity, String.class); return JSONObject.parseObject(result); }
Apifox上我就只展示body了:
Params和上面的沒(méi)有請(qǐng)求體的一樣。
curl命令如下:
curl --location --request POST 'http://xxx:8080/tree/getTree?param1=abc¶m2=123¶m3=def' --header 'Content-Type: application/json' \ --data-raw '{"parentId":80}'
這個(gè)命令里面的data-raw的值就是請(qǐng)求體。
3、調(diào)用的接口參數(shù)沒(méi)有標(biāo)識(shí)
這種的是所有的參數(shù)都使用form-data的格式進(jìn)行傳輸:
這種就必須使用LinkedMultiValueMap對(duì)參數(shù)進(jìn)行封裝:
/** * 發(fā)送form-data請(qǐng)求 * @param url 請(qǐng)求 url * @param data 請(qǐng)求體 * @return 響應(yīng)結(jié)果 */ public JSONObject httpPostResult(String url, MultiValueMap<String, String> data) { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); //解析請(qǐng)求結(jié)果 HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(data, headers); ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class); return JSONObject.parseObject(response.getBody()); }
對(duì)應(yīng)的controller中不需要任何注解:
@PostMapping("/postRequest") public JSONObject intervalData(ChargeLogIntervalDataReq request) { String url = "http://xxx:8081/api/list"; MultiValueMap<String, String> data = new LinkedMultiValueMap<>(); data.put("page", Lists.newArrayList(request.getPage())); data.put("limit", Lists.newArrayList(request.getLimit())); return httpUtils.httpPostResult(url, data); }
這里要注意,MultiValueMap的value得是list才行。
到此這篇關(guān)于springboot中RestTemplate發(fā)送HTTP請(qǐng)求的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)springboot RestTemplate發(fā)送HTTP請(qǐng)求內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot使用RestTemplate發(fā)送http請(qǐng)求的實(shí)操演示
- SpringBoot使用RestTemplate實(shí)現(xiàn)HTTP請(qǐng)求詳解
- springboot中RestTemplate配置HttpClient連接池詳解
- 基于springboot的RestTemplate、okhttp和HttpClient對(duì)比分析
- SpringBoot 利用RestTemplate http測(cè)試
- 關(guān)于springboot 中使用httpclient或RestTemplate做MultipartFile文件跨服務(wù)傳輸?shù)膯?wèn)題
- SpringBoot使用RestTemplate如何通過(guò)http請(qǐng)求將文件下載到本地
相關(guān)文章
Java責(zé)任鏈設(shè)計(jì)模式實(shí)例分析
這篇文章主要介紹了Java責(zé)任鏈設(shè)計(jì)模式,結(jié)合實(shí)例形式詳細(xì)分析了Java責(zé)任鏈設(shè)計(jì)模式的原理與相關(guān)操作技巧,需要的朋友可以參考下2019-07-07使用RocketMQTemplate發(fā)送帶tags的消息
這篇文章主要介紹了使用RocketMQTemplate發(fā)送帶tags的消息,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Javaweb動(dòng)態(tài)開(kāi)發(fā)最重要的Servlet詳解
動(dòng)態(tài)web的核心是Servlet,由tomcat解析并執(zhí)行,本質(zhì)是Java中的一個(gè)類(面向?qū)ο螅┻@個(gè)類的功能十分強(qiáng)大幾乎可以完成全部功能,在Java規(guī)范中只有Servlet實(shí)現(xiàn)類實(shí)例化的對(duì)象才能被瀏覽器訪問(wèn),所以掌握Servlet具有重要意義2022-08-08Mybatis-plus解決兼容oracle批量插入的示例詳解
Mybatis-Plus 是一個(gè) MyBatis 的增強(qiáng)工具,提供無(wú)侵入、損耗小的 CRUD 操作,本文給大家介紹了Mybatis-plus解決兼容oracle批量插入,文中通過(guò)大家介紹的非常詳細(xì),需要的朋友可以參考下2024-11-11在springboot中注入FilterRegistrationBean不生效的原因
這篇文章主要介紹了在springboot中注入FilterRegistrationBean不生效的原因及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08