Spring Boot 3.x 中 WebClient 示例详解析

2025-07-22 19:50

本文主要是介绍Spring Boot 3.x 中 WebClient 示例详解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《SpringBoot3.x中WebClient示例详解析》SpringBoot3.x中WebClient是响应式HTTP客户端,替代RestTemplate,支持异步非阻塞请求,涵盖GET...

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

1. WebClient 简介

  • 定义:Spring 5 引入的响应式 HTTP 客户,用于替代 RestTemplate(已弃用),支持异步非阻塞的 HTTP 请求。
  • 核心特性
    • 支持所有 HTTP 方法(GET/POST/PUT/DELETE 等)。
    • 灵活配置请求头、请求体、URI 参数。
    • 直接返回 Mono<ResponseEntity>Flux 获取响应细节。
    • 支持链式android调用和响应式流处理。
  • 依赖
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>

2. 示例代码详解

示例 1:GET 请求(带请求头,获取状态码和响应头)

// 1. 创建 WebClient 实例
WebClient webClient = WebClient.builder()
    .baseUrl("http://api.example.com")
    .build();
// 2. 发送 GET 请求
Mono<ResponseEntity<User>> responseMono = webClient.get()
    .uri("/users/{id}", 123) // 路径参数
    .header("Authorization", "Bearer token_123") // 添加请求头
    .retrieve() // 开始发送请求
    .toEntity(User.class); // 转换响应体为 User 对象
// 3. 处理响应
responseMono.block().ifPresent(response -> {
    int statusCode = response.getStatusCode().value(); // 状态码
    HttpHeaders headers = response.getHeaders(); // 响应头
    User user = response.getBody(); // 响应体
});

示例 2:POST 请求(传递 jsON 请求体)

// 1. 创建请求体对象
User newUser = new User("John", 25);
// 2. 发送 POST 请求
Mono<ResponseEntity<String>> responseMono = webClient.post()
  python  .uri("/users")
    .contentType(MediaType.APPLICATION_JSON) // 设置 Content-Type
    .bodyValue(newUser) // 请求体(自动序列化为 JSON)
    .retrieve()
    .toEntity(String.class); // 返回响应体(如成功返回 "Created")
// 3. 处理响应
String locationHeader = responseMono.block().getHeaders().getFirst("Location"); // 获取 Location 头

示例 3:PUT/PATCH 请求(更新资源)

// 1. 更新对象
User updatedUser = new User("John Doe", 26);
// 2. 发送 PUT 请求
Mono<Void> responseMono = webClient.put()
    .uri("/users/123")
    .contentType(MediaType.APPLICATION_JSON)
    .bodyValue(updatedUser)
    .retrieve()
    .toBodilessEntity(); // 无响应体时使用
// 3. 检查状态码
responseMono.block(); // 若无异常,则成功

示例 4:DELETE 请求

Mono<Void> responseMono = webClient.delete()
    .uri("/users/123")
    .retrieve()
    .toBodilessEntity();
// 检查状态码(如 204 No Content)
responseMono.block();

示例 5:自定义响应类型(如 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:使用响应提取器定制返回

// 自定义提取器:提取响应体中的某个字段
Mono<String> customHeaderMonojavascript = webClient.get()
    .uri("/headers")
    .retrieve()
    .onStatus(HttpStatus::is4xxClientError, 
 php       clientResponse -> Mono.error(new RuntimeException("Client error")))
    .header("X-Custom-Header") // 直接提取指定头
    .switchIfEmpty(Mono.just("Default"));
String customHeader = customHeaderMono.block();

示例 7:批量操作(查询多个资源)

// 1. 构建带查询参数的 URI
Mono<User[]> responseMono = webClient.get()
    .uri(uriBuilder -> uriBuilder
        .path("/users")
        .queryParam("page", 1)
        .queryParam("size", 10)
        .build())
    .retrieve()
    .bodyToMono(User[].class); // 返回数组
User[] users = responseMono.block();

3. 核心方法对比表格

方法HTTP 方法返回类型关键代码片段适用场景
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);需获取状态码或响应头
post().bodyValue()POSTMono<String>webClient.post().bodyValue(newUser).retrieve().bodyToMono(String.class);发送 JSON 请求体,直接返回结果
put().retrieve().toBodilessEntity()PUTMono<Void>webClient.put().uri("/users/1").retrieve().toBodilessEntity();更新资源,无响应体
delete()DELETEMono<Void>webClient.delete().uri("/users/1").retrieve().toBodilessEntity();删除资源

4. 关键配置与注意事项

  • 设置超时

    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. 总结对比表格

需求实现方法关键代码注意事项
发送 JSON 请求体使用 bodyValue()body(BodyInserter).contentType(MediaType.APPLICATION_JSON).bodyValue(newUser);确保序列化配置正确
获取状态码和响应头返回 ResponseEntity.retrieve().toEntity(User.class)处理 2xx/4xx/5xx 状态码
自定义响应类型使用 ParameterizedTypeReference 或泛型.bodyToMono(new ParameterizedTypeReference<List<User>>() {})处理复杂泛型类型
响应提取器定制使用 .header().bodyToMono() 或自定义转换逻辑.header("X-Custom-Header").switchIfEmpty(Mono.just("Default"));简化复杂响应处理逻辑

关键总结

  1. 核心类
    • WebClient:核心客户端,支持链式调用。
    • Mono/Flux:响应式类型,处理异步响应。
    • ResponseEntity:封装响应头、状态码和体。
  2. 最佳实践
    • 使用 retrieve() 统一处理响应。
    • 通过 .onStatus() 处理异常状态码。
    • 自定义 Codecs 配置序列化器。
  3. 响应式特性
    • 非阻塞 I/O,适合高并发场景。
    • 需用 block()subscribe() 处理异步结果(生产环境建议用非阻塞方式)。

通过以上示例和配置,开发者可以高效实现 REST API 的全场景调用需求,充分利用 Spring WebFlux 的响应式优势。

到此这篇关于Spring Boot 3.x 中 WebClient 全面详解及示例的文章就介绍到这了,更多相关springboot webclient内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于Spring Boot 3.x 中 WebClient 示例详解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155455

相关文章

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

javacv依赖太大导致jar包也大的解决办法

《javacv依赖太大导致jar包也大的解决办法》随着项目的复杂度和依赖关系的增加,打包后的JAR包可能会变得很大,:本文主要介绍javacv依赖太大导致jar包也大的解决办法,文中通过代码介绍的... 目录前言1.检查依赖2.更改依赖3.检查副依赖总结 前言最近在写项目时,用到了Javacv里的获取视频

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H