前言:
其實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。
祝各位小夥伴工作順利哦!