RestTemplate發(fā)送HTTP?POST請(qǐng)求使用方法詳解
本文是精講RestTemplate第4篇,前篇的blog訪問(wèn)地址如下:
RestTemplate在Spring或非Spring環(huán)境下使用精講
RestTemplate實(shí)現(xiàn)多種底層HTTP客戶(hù)端類(lèi)庫(kù)的切換用法
RestTemplate發(fā)送HTTP GET請(qǐng)求使用方法詳解
在上一節(jié)為大家介紹了RestTemplate的GET請(qǐng)求的兩個(gè)方法:getForObject()和getForEntity()。其實(shí)POST請(qǐng)求方法和GET請(qǐng)求方法上大同小異,RestTemplate的POST請(qǐng)求也包含兩個(gè)主要方法:
postForObject()
postForEntity()
二者的主要區(qū)別在于,postForObject()返回值是HTTP協(xié)議的響應(yīng)體。postForEntity()返回的是ResponseEntity,ResponseEntity是對(duì)HTTP響應(yīng)的封裝,除了包含響應(yīng)體,還包含HTTP狀態(tài)碼、contentType、contentLength、Header等信息。
一、postForObject發(fā)送JSON格式請(qǐng)求
寫(xiě)一個(gè)單元測(cè)試用例,測(cè)試用例的內(nèi)容是向指定的URL提交一個(gè)Post(帖子).
@SpringBootTest class PostTests { @Resource private RestTemplate restTemplate; @Test void testSimple() { // 請(qǐng)求地址 String url = "http://jsonplaceholder.typicode.com/posts"; // 要發(fā)送的數(shù)據(jù)對(duì)象 PostDTO postDTO = new PostDTO(); postDTO.setUserId(110); postDTO.setTitle("zimug 發(fā)布文章"); postDTO.setBody("zimug 發(fā)布文章 測(cè)試內(nèi)容"); // 發(fā)送post請(qǐng)求,并輸出結(jié)果 PostDTO result = restTemplate.postForObject(url, postDTO, PostDTO.class); System.out.println(result); } }
jsonplaceholder.typicode.com是一個(gè)可以提供在線(xiàn)免費(fèi)RESTful測(cè)試服務(wù)的一個(gè)網(wǎng)站”
/posts"服務(wù)接收PostDTO 參數(shù)對(duì)象,并將請(qǐng)求結(jié)果以JSON字符串的形式進(jìn)行響應(yīng)。響應(yīng)結(jié)果就是請(qǐng)求參數(shù)對(duì)象對(duì)應(yīng)的JSON字符串。
所以postForObject方法第二個(gè)參數(shù)是請(qǐng)求數(shù)據(jù)對(duì)象,第三個(gè)參數(shù)是返回值類(lèi)型
最終將返回值的打印結(jié)果如下:
二、postForObject模擬表單數(shù)據(jù)提交
下面給大家寫(xiě)一個(gè)使用postForObject模擬表單數(shù)據(jù)提交的例子,即:提交x-www-form-urlencoded格式的數(shù)據(jù)
@Test public void testForm() { // 請(qǐng)求地址 String url = "http://jsonplaceholder.typicode.com/posts"; // 請(qǐng)求頭設(shè)置,x-www-form-urlencoded格式的數(shù)據(jù) HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); //提交參數(shù)設(shè)置 MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); map.add("title", "zimug 發(fā)布文章第二篇"); map.add("body", "zimug 發(fā)布文章第二篇 測(cè)試內(nèi)容"); // 組裝請(qǐng)求體 HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers); // 發(fā)送post請(qǐng)求,并打印結(jié)果,以String類(lèi)型接收響應(yīng)結(jié)果JSON字符串 String result = restTemplate.postForObject(url, request, String.class); System.out.println(result); }
請(qǐng)求數(shù)據(jù)打印結(jié)果如下:
三、 url支持占位符語(yǔ)法
如果url地址上面需要傳遞一些動(dòng)態(tài)參數(shù),可以使用占位符的方式:
String url = "http://jsonplaceholder.typicode.com/{1}/{2}"; String url = "http://jsonplaceholder.typicode.com/{type}/{id}";
具體的用法和使用GET方法請(qǐng)求是一致的
所以請(qǐng)參考: RestTemplate發(fā)送HTTP GET請(qǐng)求使用方法詳解
四、postForEntity()方法
上面的所有的postForObject請(qǐng)求傳參方法,postForEntity都可以使用,使用方法上也幾乎是一致的,只是在返回結(jié)果接收的時(shí)候略有差別。
使用ResponseEntity<T> responseEntity
來(lái)接收響應(yīng)結(jié)果。用responseEntity.getBody()獲取響應(yīng)體。響應(yīng)體內(nèi)容同postForObject方法返回結(jié)果一致。剩下的這些響應(yīng)信息就是postForEntity比postForObject多出來(lái)的內(nèi)容。
HttpStatus statusCode = responseEntity.getStatusCode();獲取整體的響應(yīng)狀態(tài)信息
int statusCodeValue = responseEntity.getStatusCodeValue(); 獲取響應(yīng)碼值
HttpHeaders headers = responseEntity.getHeaders();獲取響應(yīng)頭等
@Test public void testEntityPoJo() { // 請(qǐng)求地址 String url = "http://jsonplaceholder.typicode.com/posts"; // 要發(fā)送的數(shù)據(jù)對(duì)象 PostDTO postDTO = new PostDTO(); postDTO.setUserId(110); postDTO.setTitle("zimug 發(fā)布文章"); postDTO.setBody("zimug 發(fā)布文章 測(cè)試內(nèi)容"); // 發(fā)送post請(qǐng)求,并輸出結(jié)果 ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, postDTO, String.class); String body = responseEntity.getBody(); // 獲取響應(yīng)體 System.out.println("HTTP 響應(yīng)body:" + postDTO.toString()); //以下是postForEntity比postForObject多出來(lái)的內(nèi)容 HttpStatus statusCode = responseEntity.getStatusCode(); // 獲取響應(yīng)碼 int statusCodeValue = responseEntity.getStatusCodeValue(); // 獲取響應(yīng)碼值 HttpHeaders headers = responseEntity.getHeaders(); // 獲取響應(yīng)頭 System.out.println("HTTP 響應(yīng)狀態(tài):" + statusCode); System.out.println("HTTP 響應(yīng)狀態(tài)碼:" + statusCodeValue); System.out.println("HTTP Headers信息:" + headers); }
輸出打印結(jié)果
五、postForLocation() 方法的使用
postForLocation的傳參的類(lèi)型、個(gè)數(shù)、用法基本都和postForObject()或postForEntity()一致。和前兩者的唯一區(qū)別在于返回值是一個(gè)URI。該URI返回值體現(xiàn)的是:用于提交完成數(shù)據(jù)之后的頁(yè)面跳轉(zhuǎn),或數(shù)據(jù)提交完成之后的下一步數(shù)據(jù)操作URI。
@Test public void testURI() { // 請(qǐng)求地址 String url = "http://jsonplaceholder.typicode.com/posts"; PostDTO postDTO = new PostDTO(); postDTO.setUserId(110); postDTO.setTitle("zimug 發(fā)布文章"); postDTO.setBody("zimug 發(fā)布文章 測(cè)試內(nèi)容"); // 發(fā)送post請(qǐng)求,并輸出結(jié)果 URI uri = restTemplate.postForLocation(url,postDTO); System.out.println(uri); }
輸出結(jié)果如下,含義是:提交了post之后,該post的id是101,可以通過(guò)如下的連接去獲取數(shù)據(jù)。
以上就是RestTemplate發(fā)送HTTP POST請(qǐng)求使用方法詳解的詳細(xì)內(nèi)容,更多關(guān)于RestTemplate發(fā)送HTTP POST請(qǐng)求用法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
消息隊(duì)列 RabbitMQ 與 Spring 整合使用的實(shí)例代碼
本篇文章主要介紹了消息隊(duì)列 RabbitMQ 與 Spring 整合使用的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08springBoot熱部署、請(qǐng)求轉(zhuǎn)發(fā)與重定向步驟詳解
這篇文章主要介紹了springBoot熱部署、請(qǐng)求轉(zhuǎn)發(fā)與重定向,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06Java并發(fā)工具類(lèi)Exchanger的相關(guān)知識(shí)總結(jié)
今天給大家?guī)?lái)的文章是Java工具類(lèi)Exchanger的相關(guān)知識(shí)總結(jié),文中有非常詳細(xì)的介紹及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下2021-06-06Java純代碼實(shí)現(xiàn)導(dǎo)出PDF功能
在項(xiàng)目開(kāi)發(fā)中,產(chǎn)品的需求越來(lái)越奇葩啦,開(kāi)始文件下載都是下載為excel的,做著做著需求竟然變了,要求能導(dǎo)出pdf,本文就來(lái)和大家分享一下Java實(shí)現(xiàn)導(dǎo)出PDF的常用方法吧2023-07-07spring?@value無(wú)法取值多個(gè)properties文件的解決
這篇文章主要介紹了spring?@value無(wú)法取值多個(gè)properties文件的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03在spring中使用自定義注解注冊(cè)監(jiān)聽(tīng)器的方法
本篇文章主要介紹了在spring中使用自定義注解注冊(cè)監(jiān)聽(tīng)器的方法,本文就是在分析監(jiān)聽(tīng)器回調(diào)原理的基礎(chǔ)上,在spring環(huán)境中使用自定義的注解實(shí)現(xiàn)一個(gè)監(jiān)聽(tīng)器。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01spring整合redis消息監(jiān)聽(tīng)通知使用的實(shí)現(xiàn)示例
在電商系統(tǒng)中,秒殺,搶購(gòu),紅包優(yōu)惠卷等操作,一般都會(huì)設(shè)置時(shí)間限制,本文主要介紹了spring整合redis消息監(jiān)聽(tīng)通知使用,具有一定的參考價(jià)值,感興趣的可以了解一下2021-12-12Java?SM2加密相關(guān)實(shí)現(xiàn)與簡(jiǎn)單原理詳解
SM2算法可以用較少的計(jì)算能力提供比RSA算法更高的安全強(qiáng)度,而所需的密鑰長(zhǎng)度卻遠(yuǎn)比RSA算法低,這篇文章主要給大家介紹了關(guān)于Java?SM2加密相關(guān)實(shí)現(xiàn)與簡(jiǎn)單原理的相關(guān)資料,需要的朋友可以參考下2024-01-01基于javax.validation結(jié)合spring的最佳實(shí)踐
這篇文章主要介紹了javax.validation結(jié)合spring的最佳實(shí)踐,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07