当前位置: 首页 > news >正文

网站建设网站定制市场推广计划方案

网站建设网站定制,市场推广计划方案,邹平城乡建设局网站,wordpress简洁淘宝客免费主题Spring Boot 3.x 中 WebClient 全面详解及示例 1. WebClient 简介 定义:Spring 5 引入的响应式 HTTP 客户端,用于替代 RestTemplate(已弃用),支持异步非阻塞的 HTTP 请求。核心特性: 支持所有 HTTP 方法&a…

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


1. WebClient 简介
  • 定义:Spring 5 引入的响应式 HTTP 客户端,用于替代 RestTemplate(已弃用),支持异步非阻塞的 HTTP 请求。
  • 核心特性
    • 支持所有 HTTP 方法(GET/POST/PUT/DELETE 等)。
    • 灵活配置请求头、请求体、URI 参数。
    • 直接返回 Mono<ResponseEntity>Flux 获取响应细节。
    • 支持链式调用和响应式流处理。
  • 依赖
    <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().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> 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:批量操作(查询多个资源)
// 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 的响应式优势。

http://www.cadmedia.cn/news/3578.html

相关文章:

  • 望野什么意思百度seo优化网站
  • 邯郸网站建设在哪里今日小说搜索风云榜
  • 医院网站建设的资料黄冈网站seo
  • 服装搭配网站建设策划书搜索推广广告
  • 如何查看vs中建设好的网站自动发外链工具
  • 某公司的网站建设的资金预算书网站推广的作用在哪里
  • 房城乡建设部网站百度百度一下首页
  • 优化方案2021版英语seo收录查询
  • 建设网站公司哪个好sem论坛
  • 寻求完善政府网站建设市场调研报告800字
  • 旅游网站怎么用dw做百度seo关键词报价
  • 网站建设运营合同书微博营销软件
  • 南宁网站制作设计百度账号个人中心
  • 网站建设需要具备的能力西安今日头条新闻
  • 对伊利网站建设建议小程序开发一个多少钱啊
  • 网站前台设计方案经典软文案例标题加内容
  • 网站建设辶首先金手指十四东莞seo网站推广建设
  • flash布局 的优秀网站找网站公司制作网站
  • 万网域名登录专业seo关键词优化
  • 网站如何做直播轮播企业营销策划书如何编写
  • 网站建设个人先进材料东莞网络推广及优化
  • 襄阳官网建站公司关键词搜索工具
  • 广州网站策划公司手机优化大师为什么扣钱
  • 蚌埠市建设银行官方网站公司网站怎么弄
  • 广东东莞最新疫情网站seo在线诊断分析
  • Apache局域网网站制作平台网站开发公司
  • 营销型网站的具体例子加盟
  • 云服务器价格购买价格表西安网站优化
  • 昆山市做网站济南seo整站优化价格
  • 厦门手机建站免费软文发布平台有哪些