前言:
其實POST請求方法和GET請求方法上大同小異,RestTemplate的POST請求也包含兩個主要方法:
- postForObject()
- postForEntity()
二者的主要區別在于,postForObject()回傳值是HTTP協議的回應體,postForEntity()回傳的是ResponseEntity,ResponseEntity是對HTTP回應的封裝,除了包含回應體,還包含HTTP狀態碼、contentType、contentLength、Header等資訊,
一、postForObject發送JSON格式請求
寫一個單元測驗用例,測驗用例的內容是向指定的URL提交一個Post,
@SpringBootTest
class PostTests {
@Resource
private RestTemplate restTemplate;
@Test
void testSimple() {
// 請求地址
String url = "http://jsonplaceholder.typicode.com/posts";
// 要發送的資料物件
PostDTO postDTO = new PostDTO();
postDTO.setUserId(110);
postDTO.setTitle("zimug 發布文章");
postDTO.setBody("zimug 發布文章 測驗內容");
// 發送post請求,并輸出結果
PostDTO result = restTemplate.postForObject(url, postDTO, PostDTO.class);
System.out.println(result);
}
}
- jsonplaceholder.typicode.com是一個可以提供在線免費RESTful測驗服務的一個網站,
- ”/posts"服務接收PostDTO引數物件,并將請求結果以JSON字串的形式進行回應,回應結果就是請求引數物件對應的JSON字串,
- 所以postForObject方法第二個引數是請求資料物件,第三個引數是回傳值型別,
最終將回傳值的列印結果如下:

二、postForObject模擬表單資料提交
下面給大家寫一個使用postForObject模擬表單資料提交的例子,即:提交x-www-form-urlencoded格式的資料,
@Test
public void testForm() {
// 請求地址
String url = "http://jsonplaceholder.typicode.com/posts";
// 請求頭設定,x-www-form-urlencoded格式的資料
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
//提交引數設定
MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add("title", "zimug 發布文章第二篇");
map.add("body", "zimug 發布文章第二篇 測驗內容");
// 組裝請求體
HttpEntity<MultiValueMap<String, String>> request =
new HttpEntity<MultiValueMap<String, String>>(map, headers);
// 發送post請求,并列印結果,以String型別接收回應結果JSON字串
String result = restTemplate.postForObject(url, request, String.class);
System.out.println(result);
}
請求資料列印結果如下:

三、 url支持占位符語法
如果url地址上面需要傳遞一些動態引數,可以使用占位符的方式:
String url = "http://jsonplaceholder.typicode.com/{1}/{2}";
String url = "http://jsonplaceholder.typicode.com/{type}/{id}";
四、postForEntity()方法
上面的所有的postForObject請求傳參方法,postForEntity都可以使用,使用方法上也幾乎是一致的,只是在回傳結果接收的時候略有差別,使用ResponseEntity<T> responseEntity
來接收回應結果,用responseEntity.getBody()獲取回應體,回應體內容同postForObject方法回傳結果一致,剩下的這些回應資訊就是postForEntity比postForObject多出來的內容,
- HttpStatus statusCode = responseEntity.getStatusCode();獲取整體的回應狀態資訊
- int statusCodeValue = responseEntity.getStatusCodeValue(); 獲取回應碼值
- HttpHeaders headers = responseEntity.getHeaders();獲取回應頭等
@Test
public void testEntityPoJo() {
// 請求地址
String url = "http://jsonplaceholder.typicode.com/posts";
// 要發送的資料物件
PostDTO postDTO = new PostDTO();
postDTO.setUserId(110);
postDTO.setTitle("zimug 發布文章");
postDTO.setBody("zimug 發布文章 測驗內容");
// 發送post請求,并輸出結果
ResponseEntity<String> responseEntity
= restTemplate.postForEntity(url, postDTO, String.class);
String body = responseEntity.getBody(); // 獲取回應體
System.out.println("HTTP 回應body:" + postDTO.toString());
//以下是postForEntity比postForObject多出來的內容
HttpStatus statusCode = responseEntity.getStatusCode(); // 獲取回應碼
int statusCodeValue = responseEntity.getStatusCodeValue(); // 獲取回應碼值
HttpHeaders headers = responseEntity.getHeaders(); // 獲取回應頭
System.out.println("HTTP 回應狀態:" + statusCode);
System.out.println("HTTP 回應狀態碼:" + statusCodeValue);
System.out.println("HTTP Headers資訊:" + headers);
}
輸出列印結果

五、postForLocation() 方法的使用
postForLocation的傳參的型別、個數、用法基本都和postForObject()或postForEntity()一致,和前兩者的唯一區別在于回傳值是一個URI,該URI回傳值體現的是:用于提交完成資料之后的頁面跳轉,或資料提交完成之后的下一步資料操作URI,
@Test
public void testURI() {
// 請求地址
String url = "http://jsonplaceholder.typicode.com/posts";
PostDTO postDTO = new PostDTO();
postDTO.setUserId(110);
postDTO.setTitle("zimug 發布文章");
postDTO.setBody("zimug 發布文章 測驗內容");
// 發送post請求,并輸出結果
URI uri = restTemplate.postForLocation(url,postDTO);
System.out.println(uri);
}
輸出結果如下,含義是:提交了post之后,該post的id是101,可以通過如下的連接去獲取資料,

結語:
我這還有大量的Java學習資料,如果有需要的,可以點擊進入,暗號:csjk,免費領取!

還有大量的資料,只要是Java方面的,這里都有,由于這里只能展示小部分,所以需要的請點擊進入,暗號:csjk,
祝各位小伙伴作業順利哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/202023.html
標籤:其他
上一篇:ArcGIS Server 10.0,10.1,10.2,10.3,10.4,10.5,10.7.ecp全套下載
