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

什么是 WebClient?

WebClient 是 Spring WebFlux 提供的一个非阻塞、响应式的 HTTP 客户端,可以在异步和同步场景下发起 HTTP 请求,支持 RESTful API 调用,适用于微服务间通信、第三方接口访问等。

  • 属于 Spring Framework 5 之后的标准组件

  • 可以用于响应式应用(WebFlux),也可以用在普通 Spring Boot 项目

  • 支持 GET、POST、PUT、DELETE 等全套 HTTP 操作

  • 支持同步/异步、流式数据、超时、拦截、cookie 等高级特性


为什么推荐用 WebClient?

  • 异步非阻塞:适合高并发、性能敏感场景

  • 链式API:编码风格现代,使用更流畅

  • 支持响应式流:天然支持 reactive 流编程(Flux/Mono)

  • 配置灵活:更容易自定义 header、cookie、超时、代理等

  • 官方推荐:RestTemplate 已停止进化,WebClient 作为新一代主推


基本用法(同步&异步)

1. 创建 WebClient 实例

// 一般推荐单例、注入
WebClient webClient = WebClient.create("http://localhost:8080");

或者 Spring Bean 注入方式:

@Bean
public WebClient.Builder webClientBuilder() {return WebClient.builder();
}

2. 发送 GET 请求(异步响应式)

webClient.get().uri("/api/user/1").retrieve().bodyToMono(User.class).subscribe(user -> {System.out.println("获取到用户:" + user);});

3. 同步阻塞式获取数据(和 RestTemplate 类似)

User user = webClient.get().uri("/api/user/1").retrieve().bodyToMono(User.class).block();  // block() 变同步,直到拿到结果

4. 发送 POST 请求

User user = new User("Tom");
User result = webClient.post().uri("/api/user").bodyValue(user).retrieve().bodyToMono(User.class).block();

进阶用法

  • 自定义 Header/Token

webClient.get().uri("/api/user/1").header(HttpHeaders.AUTHORIZATION, "Bearer your_token").retrieve().bodyToMono(User.class);

并发/批量请求

利用 Flux/Mono 组合,批量请求,聚合响应,支持高性能异步处理。

适用场景

  • 微服务间 HTTP 通信

  • 调用第三方 RESTful API

  • 高并发数据采集、抓取

  • 需要响应式、非阻塞能力的服务(如 WebFlux)

总结

WebClient 是 Spring 5.x 以后推荐使用的响应式 HTTP 客户端,支持同步/异步、链式调用和丰富扩展,是微服务、现代后端项目的主流选择。

http://www.dtcms.com/a/282416.html

相关文章:

  • xss-labs的小练
  • 基于faster-r-cnn行人检测和ResNet50+FPN的可见光红外图像多模态算法融合创新
  • VIVADO技巧_BUFGMUX时序优化
  • 比特币技术简史 第二章:密码学基础 - 哈希函数、公钥密码学与数字签名
  • 基于阿里云云服务器-局域网组网软件
  • Mfc初始化顺序
  • 【27】MFC入门到精通——MFC 修改用户界面登录IP IP Address Control
  • 虚幻引擎5 GAS开发俯视角RPG游戏 #06-7:无限游戏效果
  • 【28】MFC入门到精通——MFC串口 Combobox 控件实现串口号
  • 技术演进中的开发沉思-36 MFC系列: 对话框
  • Java并发编程(一)
  • LeetCode Hot 100 二叉树的最大深度
  • .NET 10 Preview 4 已发布
  • 【C# in .NET】9. 探秘委托:函数抽象的底层机制
  • 设置第三方窗口置顶(SetWindowPos方法,vb.net)
  • WMS仓储管理系统智能调控提升电子企业库存周转率
  • 系统启动流程分析
  • Linux-RAID
  • QML 五大对话框组件
  • 端口被占用时的解决问题
  • Egg.js × NestJS 2025 Nodejs后端框架选型指南
  • 代码随想录算法训练营十七天|二叉树part07
  • 【android bluetooth 协议分析 03】【蓝牙扫描详解 2】【app触发蓝牙扫描后,协议栈都做了那些事情】
  • 跨平台 App 如何无痛迁移到鸿蒙系统?全流程实战+Demo 教程
  • 八股文——包装类
  • Android 升级targetSdk无法启动服务
  • 动态规划题解——分割等和子集【LeetCode】
  • 面向向量检索的教育QA建模:九段日本文化研究所日本语学院的Prompt策略分析(6 / 500)
  • 知识点3:python-sdk 核心概念(prompt、image、context)
  • 有哪些好用的原型设计软件?墨刀、Axure等测评对比