精講響應式WebClient第3篇-POST、DELETE、PUT方法使用

字母哥部落格發表於2020-08-22

本文是精講響應式WebClient第3篇,前篇的blog訪問地址如下:

一、RESTful風格與HTTP method

熟悉RESTful風格的朋友,應該瞭解RESTful風格API使用HTTP method表達對資源的操作。

常用HTTP方法 RESTful風格語義(操作)
GET 查詢、獲取資料
POST 新增、提交資料
DELETE 刪除資料
PUT 更新、修改資料

在上一篇文章中我們已經為大家介紹瞭如何使用WebClient作為Http客戶端傳送GET請求與進行響應結果的接收。本節來為大家介紹POST、DELETE、PUT。

POST等其他的方法在與GET方法在使用如下方法的時候是一致的:

  • block()阻塞獲取響應結果的方法,subscribe()非阻塞非同步結果訂閱方法
  • retrieve()獲取HTTP響應體,exchange()除了獲取HTTP響應體,還可以獲取HTTP 狀態碼、headers、cookies等HTTP報文資訊。
  • 使用Mono接收單個物件的響應結果,使用Flux接收集合類物件的響應結果。
  • 佔位符語法傳參方式

所以想了解以上資訊,請去參考: 精講響應式WebClient第2篇-GET請求阻塞與非阻塞呼叫方法詳解。 本文只介紹POST、DELETE、PUT在使用過程中與GET不一樣的地方。

為了方便後續開發測試,首先介紹一個網站給大家。JSONPlaceholder是一個提供免費的線上REST API的網站,我們在開發時可以使用它提供的url地址測試下網路請求以及請求引數。或者當我們程式需要獲取一些模擬資料、模擬圖片時也可以使用它。

二、Post請求傳送JSON字串、物件、表單資料

2.1.使用Post方法向服務端傳送JSON字串資料

public class OtherTest {

  //建立webClient
  private WebClient webClient = WebClient.builder()
          .baseUrl("http://jsonplaceholder.typicode.com")
          .build();


  @Test
  public void testPostJsonStr() {
    // 提交給服務端的JSON字串
    String jsonStr = "{\"userId\": 1,\"title\": \"zimugtest\",\"body\": \"字母哥進行測試\"}";

    // 傳送請求
    Mono<String> mono = webClient
            .post() // POST 請求
            .uri("/posts")  // 請求路徑
            .contentType(MediaType.APPLICATION_JSON)  //JSON資料型別
            .body(BodyInserters.fromValue(jsonStr))  //JSON字串資料
            .retrieve() // 獲取響應體
            .bodyToMono(String.class); //響應資料型別轉換

    // 輸出結果
    System.out.println(mono.block());
  }

}

響應結果列印如下,"http://jsonplaceholder.typicode.com/posts/1" 服務的請求資料就是響應資料。響應結果同樣是一個JSON字串:

2.2.將物件以JSON資料形式傳送服務端

  @Test
  public void testPostJson() {
    //構建請求傳送物件
    PostDTO postDTO = new PostDTO();
    postDTO.setUserId(110);
    postDTO.setTitle("zimug-test");
    postDTO.setBody("字母哥進行Post測試");

    //傳送請求
    Mono<PostDTO> mono = webClient
            .post() // 傳送POST 請求
            .uri("/posts")  //服務請求路徑,基於baseurl
            .contentType(MediaType.APPLICATION_JSON)  //以JSON資料格式
            .bodyValue(postDTO)   //傳送請求體,物件形式
            .retrieve() // 獲取響應體
            .bodyToMono(PostDTO.class); //響應資料型別轉換

    // 輸出結果
    System.out.println("=====" + mono.block());
  }

響應結果列印如下,使用PostDTO接收響應結果。因為 "http://jsonplaceholder.typicode.com/posts/1" 服務的請求資料就是響應資料。列印結果是PostDTO物件的toString()方法

2.3.POST模擬表單資料提交

  @Test
  public void testFormSubmit()  {
    //表單資料引數設定
    MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
    map.add("title", "zimug-test");
    map.add("body", "字母哥進行測試");

    // 傳送請求
    Mono<String> mono = webClient
            .post() // 傳送POST 請求
            .uri("/posts")  // 請求路徑
            .contentType(MediaType.APPLICATION_FORM_URLENCODED)  //表單資料型別
            .body(BodyInserters.fromFormData(map))  //表單資料
            .retrieve() // 獲取響應體
            .bodyToMono(String.class); //響應資料型別轉換

    // 輸出結果
    System.out.println(mono.block());
  }
  
}

因為使用字串的方式接受響應結果,所以輸出和《2.1.使用Post方法向服務端傳送JSON字串資料》輸出結果是一樣的。

三、使用 DELETE方法去刪除資源

刪除一個已經存在的資源,使用webClient的delete()方法。該方法會向URL代表的資源傳送一個HTTP DELETE方法請求。

@Test
public void testDelete()  {
  // 傳送Delete請求
  webClient.delete().uri("/posts/1");  // 請求路徑
}

在前面章節測試類的基礎上,寫如上程式碼的測試用例。上面程式碼含義為刪除posts列表裡面的第1個帖子。

四、使用PUT方法去修改資源

修改一個已經存在的資源,使用webClient的put()方法。該方法會向URL代表的資源傳送一個HTTP PUT方法請求。

@Test
public void testPut()  {
  //要修改的資料物件
  PostDTO postDTO = new PostDTO();
  postDTO.setId(1);
  postDTO.setBody("字母哥進行Put測試");

  Mono<PostDTO> mono = webClient
          .put()
          .uri("/posts/1")  //服務請求路徑,基於baseurl
          .contentType(MediaType.APPLICATION_JSON)
          .bodyValue(postDTO)   //傳送請求體
          .retrieve() // 獲取響應體
          .bodyToMono(PostDTO.class); //響應資料型別轉換

  // 輸出結果
  System.out.println("=====" + mono.block());
}

上面程式碼RESTful風格語義是:修改posts列表裡面的第1個帖子。輸出結果如下,是修改資料之後的結果:

歡迎關注我的部落格,裡面有很多精品合集

  • 本文轉載註明出處(必須帶連線,不能只轉文字):字母哥部落格

覺得對您有幫助的話,幫我點贊、分享!您的支援是我不竭的創作動力! 。另外,筆者最近一段時間輸出瞭如下的精品內容,期待您的關注。

相關文章