最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Boot?3.x?中?WebClient?示例詳解析

 更新時(shí)間:2025年07月22日 11:34:54   作者:愛的嘆息  
SpringBoot3.x中WebClient是響應(yīng)式HTTP客戶端,替代RestTemplate,支持異步非阻塞請求,涵蓋GET/POST/PUT/DELETE等方法,通過鏈?zhǔn)秸{(diào)用處理響應(yīng),需注意非阻塞I/O及超時(shí)、異常配置,本文給大家介紹SpringBoot3.x中WebClient示例,感興趣的朋友一起看看吧

Spring Boot 3.x 中 WebClient 全面詳解及示例

1. WebClient 簡介

  • 定義:Spring 5 引入的響應(yīng)式 HTTP 客戶端,用于替代 RestTemplate(已棄用),支持異步非阻塞的 HTTP 請求。
  • 核心特性
    • 支持所有 HTTP 方法(GET/POST/PUT/DELETE 等)。
    • 靈活配置請求頭、請求體、URI 參數(shù)。
    • 直接返回 Mono<ResponseEntity>Flux 獲取響應(yīng)細(xì)節(jié)。
    • 支持鏈?zhǔn)秸{(diào)用和響應(yīng)式流處理。
  • 依賴
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>

2. 示例代碼詳解

示例 1:GET 請求(帶請求頭,獲取狀態(tài)碼和響應(yīng)頭)

// 1. 創(chuàng)建 WebClient 實(shí)例
WebClient webClient = WebClient.builder()
    .baseUrl("http://api.example.com")
    .build();
// 2. 發(fā)送 GET 請求
Mono<ResponseEntity<User>> responseMono = webClient.get()
    .uri("/users/{id}", 123) // 路徑參數(shù)
    .header("Authorization", "Bearer token_123") // 添加請求頭
    .retrieve() // 開始發(fā)送請求
    .toEntity(User.class); // 轉(zhuǎn)換響應(yīng)體為 User 對象
// 3. 處理響應(yīng)
responseMono.block().ifPresent(response -> {
    int statusCode = response.getStatusCode().value(); // 狀態(tài)碼
    HttpHeaders headers = response.getHeaders(); // 響應(yīng)頭
    User user = response.getBody(); // 響應(yīng)體
});

示例 2:POST 請求(傳遞 JSON 請求體)

// 1. 創(chuàng)建請求體對象
User newUser = new User("John", 25);
// 2. 發(fā)送 POST 請求
Mono<ResponseEntity<String>> responseMono = webClient.post()
    .uri("/users")
    .contentType(MediaType.APPLICATION_JSON) // 設(shè)置 Content-Type
    .bodyValue(newUser) // 請求體(自動序列化為 JSON)
    .retrieve()
    .toEntity(String.class); // 返回響應(yīng)體(如成功返回 "Created")
// 3. 處理響應(yīng)
String locationHeader = responseMono.block().getHeaders().getFirst("Location"); // 獲取 Location 頭

示例 3:PUT/PATCH 請求(更新資源)

// 1. 更新對象
User updatedUser = new User("John Doe", 26);
// 2. 發(fā)送 PUT 請求
Mono<Void> responseMono = webClient.put()
    .uri("/users/123")
    .contentType(MediaType.APPLICATION_JSON)
    .bodyValue(updatedUser)
    .retrieve()
    .toBodilessEntity(); // 無響應(yīng)體時(shí)使用
// 3. 檢查狀態(tài)碼
responseMono.block(); // 若無異常,則成功

示例 4:DELETE 請求

Mono<Void> responseMono = webClient.delete()
    .uri("/users/123")
    .retrieve()
    .toBodilessEntity();
// 檢查狀態(tài)碼(如 204 No Content)
responseMono.block();

示例 5:自定義響應(yīng)類型(如 Map)

Mono<ResponseEntity<Map<String, Object>>> responseMono = webClient.get()
    .uri("/data")
    .retrieve()
    .toEntity(new ParameterizedTypeReference<Map<String, Object>>() {});
Map<String, Object> data = responseMono.block().getBody();

示例 6:使用響應(yīng)提取器定制返回

// 自定義提取器:提取響應(yīng)體中的某個(gè)字段
Mono<String> customHeaderMono = webClient.get()
    .uri("/headers")
    .retrieve()
    .onStatus(HttpStatus::is4xxClientError, 
        clientResponse -> Mono.error(new RuntimeException("Client error")))
    .header("X-Custom-Header") // 直接提取指定頭
    .switchIfEmpty(Mono.just("Default"));
String customHeader = customHeaderMono.block();

示例 7:批量操作(查詢多個(gè)資源)

// 1. 構(gòu)建帶查詢參數(shù)的 URI
Mono<User[]> responseMono = webClient.get()
    .uri(uriBuilder -> uriBuilder
        .path("/users")
        .queryParam("page", 1)
        .queryParam("size", 10)
        .build())
    .retrieve()
    .bodyToMono(User[].class); // 返回?cái)?shù)組
User[] users = responseMono.block();

3. 核心方法對比表格

方法HTTP 方法返回類型關(guān)鍵代碼片段適用場景
get()GETMono<User>webClient.get().uri("/users/1").retrieve().bodyToMono(User.class);簡單 GET 請求,直接返回對象
retrieve().toEntity()GETMono<ResponseEntity<User>>webClient.get().uri("/users/1").retrieve().toEntity(User.class);需獲取狀態(tài)碼或響應(yīng)頭
post().bodyValue()POSTMono<String>webClient.post().bodyValue(newUser).retrieve().bodyToMono(String.class);發(fā)送 JSON 請求體,直接返回結(jié)果
put().retrieve().toBodilessEntity()PUTMono<Void>webClient.put().uri("/users/1").retrieve().toBodilessEntity();更新資源,無響應(yīng)體
delete()DELETEMono<Void>webClient.delete().uri("/users/1").retrieve().toBodilessEntity();刪除資源

4. 關(guān)鍵配置與注意事項(xiàng)

  • 設(shè)置超時(shí)

    WebClient webClient = WebClient.builder()
        .timeout(Duration.ofSeconds(5))
        .build();
    
  • 異常處理

    Mono<User> response = webClient.get()
        .uri("/users/invalid")
        .retrieve()
        .onStatus(HttpStatus::is4xxClientError, 
            clientResponse -> Mono.error(new CustomException()))
        .bodyToMono(User.class);
    
  • 自定義序列化

    ObjectMapper objectMapper = new ObjectMapper();
    WebClient webClient = WebClient.builder()
        .codecs(configurer -> configurer.defaultCodecs()
            .jackson2JsonEncoder(new Jackson2JsonEncoder(objectMapper)))
        .build();
    

5. 總結(jié)對比表格

需求實(shí)現(xiàn)方法關(guān)鍵代碼注意事項(xiàng)
發(fā)送 JSON 請求體使用 bodyValue()body(BodyInserter).contentType(MediaType.APPLICATION_JSON).bodyValue(newUser);確保序列化配置正確
獲取狀態(tài)碼和響應(yīng)頭返回 ResponseEntity.retrieve().toEntity(User.class)處理 2xx/4xx/5xx 狀態(tài)碼
自定義響應(yīng)類型使用 ParameterizedTypeReference 或泛型.bodyToMono(new ParameterizedTypeReference<List<User>>() {})處理復(fù)雜泛型類型
響應(yīng)提取器定制使用 .header()、.bodyToMono() 或自定義轉(zhuǎn)換邏輯.header("X-Custom-Header").switchIfEmpty(Mono.just("Default"));簡化復(fù)雜響應(yīng)處理邏輯

關(guān)鍵總結(jié)

  1. 核心類
    • WebClient:核心客戶端,支持鏈?zhǔn)秸{(diào)用。
    • Mono/Flux:響應(yīng)式類型,處理異步響應(yīng)。
    • ResponseEntity:封裝響應(yīng)頭、狀態(tài)碼和體。
  2. 最佳實(shí)踐
    • 使用 retrieve() 統(tǒng)一處理響應(yīng)。
    • 通過 .onStatus() 處理異常狀態(tài)碼。
    • 自定義 Codecs 配置序列化器。
  3. 響應(yīng)式特性
    • 非阻塞 I/O,適合高并發(fā)場景。
    • 需用 block()subscribe() 處理異步結(jié)果(生產(chǎn)環(huán)境建議用非阻塞方式)。

通過以上示例和配置,開發(fā)者可以高效實(shí)現(xiàn) REST API 的全場景調(diào)用需求,充分利用 Spring WebFlux 的響應(yīng)式優(yōu)勢。

到此這篇關(guān)于Spring Boot 3.x 中 WebClient 全面詳解及示例的文章就介紹到這了,更多相關(guān)springboot webclient內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中的HashMap弱引用之WeakHashMap詳解

    Java中的HashMap弱引用之WeakHashMap詳解

    這篇文章主要介紹了Java中的HashMap弱引用之WeakHashMap詳解,當(dāng)內(nèi)存空間不足,Java虛擬機(jī)寧愿拋出OutOfMemoryError錯(cuò)誤,使程序異常終止,也不會靠隨意回收具有強(qiáng)引用的對象來解決內(nèi)存不足的問題,需要的朋友可以參考下
    2023-09-09
  • java生成圖片驗(yàn)證碼功能

    java生成圖片驗(yàn)證碼功能

    最近在用ssm框架做一個(gè)管理系統(tǒng),做到登錄驗(yàn)證時(shí),需要實(shí)現(xiàn)圖片驗(yàn)證碼功能,今天小編給大家分享基于java制作的圖片驗(yàn)證碼功能,感興趣的朋友一起看看吧
    2019-12-12
  • JPA延遲加載no Session報(bào)錯(cuò)解決分析

    JPA延遲加載no Session報(bào)錯(cuò)解決分析

    這篇文章主要為大家介紹了JPA延遲加載no Session報(bào)錯(cuò)解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • springboot整合xxl-job的實(shí)現(xiàn)示例

    springboot整合xxl-job的實(shí)現(xiàn)示例

    本文主要介紹了springboot整合xxl-job的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • SpringBoot自定義/error路徑失效的解決

    SpringBoot自定義/error路徑失效的解決

    這篇文章主要介紹了SpringBoot自定義/error路徑失效的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java sqlserver text 類型字段讀取方法

    java sqlserver text 類型字段讀取方法

    有這樣一個(gè)需求,需要將原本存儲在數(shù)據(jù)庫中的文檔轉(zhuǎn)存至文件系統(tǒng)中,于是寫了一個(gè)簡單的程序完成此功能
    2012-11-11
  • Maven的使用之繼承與聚合

    Maven的使用之繼承與聚合

    這篇文章主要為大家詳細(xì)介紹了Maven的繼承和聚合,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2023-04-04
  • spring、mybatis 配置方式詳解(常用兩種方式)

    spring、mybatis 配置方式詳解(常用兩種方式)

    這篇文章給大家總結(jié)了常用的兩種spring、mybatis 配置方式,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2017-12-12
  • struts2實(shí)現(xiàn)文件下載功能

    struts2實(shí)現(xiàn)文件下載功能

    這篇文章主要為大家詳細(xì)介紹了struts2實(shí)現(xiàn)文件下載功能,一個(gè)非常常見的功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Java TimeoutException:服務(wù)調(diào)用超時(shí)異常的正確解決方案

    Java TimeoutException:服務(wù)調(diào)用超時(shí)異常的正確解決方案

    在現(xiàn)代軟件開發(fā)中,服務(wù)間通信是構(gòu)建分布式系統(tǒng)的基礎(chǔ),然而,網(wǎng)絡(luò)延遲、服務(wù)負(fù)載、資源競爭等因素都可能導(dǎo)致服務(wù)調(diào)用超時(shí),TimeoutException是Java中表示服務(wù)調(diào)用超時(shí)的常見異常之一,本文將探討TimeoutException的成因及解決方案,需要的朋友可以參考下
    2024-12-12

最新評論

滕州市| 泉州市| 奉化市| 宿州市| 江油市| 布拖县| 天气| 凌云县| 库尔勒市| 沂水县| 宜阳县| 嘉善县| 石楼县| 保亭| 得荣县| 宜良县| 土默特右旗| 汉沽区| 东乌珠穆沁旗| 监利县| 汝州市| 阜康市| 平南县| 江永县| 桦南县| 新闻| 永州市| 鄂托克旗| 三原县| 宜昌市| 嘉义县| 五指山市| 汝州市| 刚察县| 永安市| 乐山市| 山东省| 镇巴县| 磴口县| 海阳市| 阳谷县|