RestTemplate調(diào)用POST和GET請(qǐng)求示例詳解
正文
在日常開發(fā)過程中,http接口不僅提供給前端調(diào)用,有的時(shí)候還需要提供給其他業(yè)務(wù)方調(diào)用,在后臺(tái)調(diào)用http請(qǐng)求的時(shí)候,我們一般使用Http Client客戶端調(diào)用,java常用的Http客戶端有:
- java原生的HttpURLConnection
- Apache http client
- OkHttp
- RestTemplate
下面來詳細(xì)介紹一下使用RestTemplate來調(diào)用Post和Get請(qǐng)求。
在RestTemplate中,對(duì)同一種請(qǐng)求方式,一般有兩種調(diào)用方法:
- xxForObject
- 返回一個(gè)指定類型的對(duì)象,通常是響應(yīng)體反序列化后的java對(duì)象
- 只返回反序列化的java對(duì)象,沒有額外的http相應(yīng)信息,只知道請(qǐng)求是否成功。
- xxForEntity
- 返回的是一個(gè)ResponseEntity對(duì)象,其中包含完整的http響應(yīng)信息(狀態(tài)碼、響應(yīng)頭、響應(yīng)體)
一、POST請(qǐng)求調(diào)用
- postForObject
/** String/URI url: 請(qǐng)求的URL路徑 request: 一般設(shè)置請(qǐng)求頭和請(qǐng)求體 responseType:請(qǐng)求完成之后返回的結(jié)果類型 Map<String, ?>/Object... uriVariables: 用來拼接請(qǐng)求url,可以是Map<String, ?>類型或Object類型可變參數(shù) **/ postForObject/postForEntity(String url, Object request, Class<T> responseType, Object... uriVariables) eg: void fun() { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); HttpEntity<String> httpEntity = new HttpEntity<>(params, headers); // 注意,如果想要使用可變參數(shù)來拼接url,那這里的url一定要使用占位符{}替換,并且名稱要和可變參數(shù)名稱一樣才能在運(yùn)行時(shí)將占位符位置替換成傳入動(dòng)態(tài)參數(shù)【可變參數(shù)也可以不傳,那么這里的url就不需要占位符拼接】 String url = "http://www.sea.com?uid={uid}&username={username}"; String uid = "123"; String username = "sea"; // 因?yàn)閞esponseType用的是String類型,所以返回的是一個(gè)String類型字符串 String result = restTemplate.postForObject(url, httpEntity, String.class, uid, username); } postForObject/postForEntity(String url, Object request, Class<T> responseType, Map<String, ?> uriVariables) eg: void fun() { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); HttpEntity<String> httpEntity = new HttpEntity<>(params, headers); // 注意,如果想要使用可變參數(shù)來拼接url,那這里的url一定要使用占位符{}替換,并且名稱要和可變參數(shù)名稱一樣才能在運(yùn)行時(shí)將占位符位置替換成傳入動(dòng)態(tài)參數(shù) String url = "http://www.sea.com?uid={uid}&username={username}"; Map<String, Object> params = new HashMap<>(); String uid = "123"; String username = "sea"; params.put("uid", uid); params.put("username", username) // 因?yàn)閞esponseType用的是String類型,所以返回的是一個(gè)String類型字符串 String result = restTemplate.postForObject(url, httpEntity, String.class, params); } postForObject/postForEntity(URI url, Object request, Class<T> responseType) eg: void fun() { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); HttpEntity<String> httpEntity = new HttpEntity<>(params, headers); String url = "http://www.sea.com"; MultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<>(); multiValueMap.put("uid", 123); multiValueMap.put("username", "sea"); // 不再使用可變參數(shù)綁定url,直接傳入綁定后的uri參數(shù) URI uri = UriComponentsBuilder.fromHttpUrl(url).queryParams(multiValueMap).build().encode().toUri(); // 因?yàn)閞esponseType用的是String類型,所以返回的是一個(gè)String類型字符串 String result = restTemplate.postForObject(uri, httpEntity, String.class); } eg: xxforEntity() void fun() { Map<String, Object> map = new HashMap<>(); map.put("uid", 123); map.put("username", "sea"); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity<HashMap<String, Object>> httpEntity = new HttpEntity<>(map, headers); String url = "http://www.sea.com"; // 使用xxforEntity,返回的是一個(gè)ResponseEntity,里面包含了statusCode(狀態(tài)碼)、Headers(響應(yīng)頭)、body(響應(yīng)體) ResponseEntity<String> responseEntity = restTemplate.postForEntity(uri, httpEntity, String.class); }
二、GET請(qǐng)求調(diào)用
getForObject/getForEntity(String url, Class<T> responseType, Object... uriVariables) getForObject/getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables) getForObject/getForEntity(URI url, Class<T> responseType) 在get請(qǐng)求調(diào)用中,除了請(qǐng)求參數(shù)中少了Object request【請(qǐng)求頭和請(qǐng)求體】,其他的參數(shù)和方法調(diào)用同上面post的方法調(diào)用是一樣的
三、Exchange調(diào)用
exchange調(diào)用可以理解為是一個(gè)萬(wàn)能調(diào)用,不特定是post還是get類型調(diào)用,請(qǐng)求方式由調(diào)用者指定。 ps:如果在get請(qǐng)求中需要指定請(qǐng)求頭和請(qǐng)求體,而getForXX又不支持方法又不支持設(shè)置請(qǐng)求頭,此時(shí)可以改成用exchange方法來調(diào)用,自己往HttpEntity<?> requestEntity參數(shù)中設(shè)置請(qǐng)求頭和體。
以上就是RestTemplate調(diào)用POST和GET請(qǐng)求示例詳解的詳細(xì)內(nèi)容,更多關(guān)于RestTemplate調(diào)用POST GET的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 關(guān)于RestTemplate中的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)用接口亂碼的問題
- RestTemplate發(fā)送get和post請(qǐng)求,下載文件的實(shí)例
- RestTemplate get請(qǐng)求攜帶headers自動(dòng)拼接參數(shù)方式
相關(guān)文章
SpringBoot整合Mybatis-plus的具體過程使用
這篇文章主要介紹了SpringBoot?整合mybatis+mybatis-plus的步驟,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06Java實(shí)現(xiàn)合并word文檔的示例代碼
在做項(xiàng)目中,經(jīng)常會(huì)遇到一種情況,需要將一個(gè)小word文檔的內(nèi)容插入到一個(gè)大word(主文檔)中。本文就為大家準(zhǔn)備了Java實(shí)現(xiàn)合并word文檔的方法,需要的可以參考一下2022-08-08Java 線程池ThreadPoolExecutor源碼解析
這篇文章主要介紹了Java 線程池ThreadPoolExecutor源碼解析2022-03-03Java微信公眾平臺(tái)開發(fā)(1) 接入微信公眾平臺(tái)
這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺(tái)開發(fā)第一步,接入微信公眾平臺(tái),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04java如何創(chuàng)建一個(gè)jdbc程序詳解
使用Java程序來操作數(shù)據(jù)庫(kù),后者更加直接的話就是使用Java程序來發(fā)送SQL語(yǔ)句的技術(shù)稱之為:JDBC。下面這篇文章主要給大家介紹了關(guān)于利用java如何創(chuàng)建一個(gè)jdbc程序的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-11-11