首頁 > 軟體

RestTemplate傳送HTTP POST請求使用方法詳解

2022-03-17 10:00:28

本文是精講RestTemplate第4篇,前篇的blog存取地址如下:

RestTemplate在Spring或非Spring環境下使用精講

RestTemplate實現多種底層HTTP使用者端類庫的切換用法

RestTemplate傳送HTTP GET請求使用方法詳解

在上一節為大家介紹了RestTemplate的GET請求的兩個方法:getForObject()和getForEntity()。其實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}";

具體的用法和使用GET方法請求是一致的

所以請參考: RestTemplate傳送HTTP GET請求使用方法詳解

四、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,可以通過如下的連線去獲取資料。

以上就是RestTemplate傳送HTTP POST請求使用方法詳解的詳細內容,更多關於RestTemplate傳送HTTP POST請求用法的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com