本文是精講響應式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個帖子。輸出結果如下,是修改數據之后的結果:

歡迎關注我的博客,里面有很多精品合集
- 本文轉載注明出處(必須帶連接,不能只轉文字):字母哥博客。
覺得對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創作動力! 。另外,筆者最近一段時間輸出了如下的精品內容,期待您的關注。
