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

SpringBoot WebClient 介绍

目录一、什么是 WebClient二、 WebClient 能解决什么问题三、WebClient 和 RestTemplate 的区别四、WebClient 的核心优势1. 非阻塞Non-Blocking2. 支持异步3. 链式 API 更现代五、WebClient 的核心对象六、Mono 和 Flux 是什么七、如何引入 WebClientMaven八、WebClient 的基本创建方式1. 创建 WebClient 最简单的使用方式2.Spring Bean 配置类方式(推荐)九、GET 带参数请求代码代码解析get()uri()headers()retrieve()bodyToMono()block()十、GET 返回对象User 类调用十一、POST 请求示例请求DTOPOST 代码bodyValue() 是什么十二、PUT 请求十三、DELETE 请求十四、下载文件下载文件为 byte[]保存本地文件大文件下载推荐流式十五、错误处理普通写法onStatus 状态码错误处理try-catch十六、retrieve() 和 exchangeToMono() 区别retrieve()最常用exchangeToMono()十七、 WebClient适合场景与不适合场景十八、WebClient 学习路线十九、最常用写法总结1.GET2.POST3.设置 header4.设置 body5.获取响应6.阻塞等待二十、完整实战示例二十一、最后总结一、什么是 WebClientWebClient是 Spring 5 引入的一个现代 HTTP 客户端属于 Spring WebFlux 模块用来发送 HTTP 请求GET、POST、PUT、DELETE 等。它可以替代传统的RestTemplate。(Home)WebClient 它底层基于ReactorNettyNIO因此少量线程 处理大量请求这也是它高并发能力强的原因。(Home)官方文档Spring WebClient 官方文档Spring WebFlux 官方文档二、 WebClient 能解决什么问题它主要用于调用第三方接口微服务之间通信下载文件上传文件调用 AI / OpenAPI 接口高并发 HTTP 请求异步并发调用多个接口例如你的系统 ↓ WebClient ↓ 支付宝接口 / 微信接口 / 第三方系统三、WebClient 和 RestTemplate 的区别对比项WebClientRestTemplate所属Spring WebFluxSpring MVC是否异步支持默认同步阻塞是否非阻塞是否是否支持响应式支持 Mono / Flux不支持并发能力高一般是否支持流式处理支持一般推荐程度新项目推荐维护模式API 风格链式 fluent API模板式 APISpring 官方已经说明RestTemplate进入 maintenance mode维护模式新项目更推荐WebClient(Reddit)四、WebClient 的核心优势1. 非阻塞Non-Blocking传统 RestTemplate线程发请求 ↓ 一直等待响应 ↓ 线程被占用WebClient线程发请求 ↓ 不用等待 ↓ 线程去处理别的任务 ↓ 响应回来再通知因此更省线程更适合高并发更适合微服务支持同步调用WebClient 虽然是响应式的但你也能.block()变成同步调用。因此即使你不是响应式项目也能使用 WebClient。2. 支持异步可以同时请求多个接口MonoUseruserMonowebClient.get()...MonoOrderorderMonowebClient.get()...最后组合Mono.zip(userMono,orderMono)3. 链式 API 更现代传统的 RestTemplaterestTemplate.exchange(...)而 WebClientwebClient.get().uri(/user).retrieve().bodyToMono(User.class);更像Java8 Stream函数式编程Reactor 响应式风格五、WebClient 的核心对象最重要的WebClient它类似浏览器客户端负责发请求设置 header设置 token接收响应下载文件六、Mono 和 Flux 是什么WebClient 基于 Reactor。两个核心类类型含义Mono0~1 个结果Flux0~N 个结果例如MonoUserFluxUser表示MonoUser表示未来会返回一个 User FluxUser表示未来会返回多个 User七、如何引入 WebClientMavenSpring Boot 项目dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-webflux/artifactId/dependency即使你项目不是 WebFlux 项目也能单独使用 WebClient。八、WebClient 的基本创建方式1. 创建 WebClient 最简单的使用方式WebClientwebClientWebClient.create();或者WebClientwebClientWebClient.create(https://api.example.com);或者WebClientwebClientWebClient.builder().baseUrl(https://api.example.com).build();2.Spring Bean 配置类方式(推荐)配置类ConfigurationpublicclassWebClientConfig{BeanpublicWebClientwebClient(){//配置超时和日志HttpClienthttpClientHttpClient.create().responseTimeout(Duration.ofSeconds(10)).wiretap(true);returnWebClient.builder()//基本url域名.baseUrl(https://api.example.com)//默认请求头增加类型为json.defaultHeader(HttpHeaders.CONTENT_TYPE,MediaType.APPLICATION_JSON_VALUE)//默认请求头增加token.defaultHeader(HttpHeaders.AUTHORIZATION,Bearer abcdefg)//超时配置和日志.clientConnector(newReactorClientHttpConnector(httpClient)).build();}}通常 token 是动态获取的可以使用 filter下面的示例使用 getToken() 动态获取 token。Filter 示例BeanpublicWebClientwebClient(){returnWebClient.builder().filter((request,next)-{ClientRequestnewRequestClientRequest.from(request).header(HttpHeaders.AUTHORIZATION,Bearer getToken()).build();returnnext.exchange(newRequest);}).build();}官方 builder 配置项包括baseUrldefaultHeaderfiltercodectimeoutconnector 等 (Spring 框架)注入使用AutowiredprivateWebClientwebClient;九、GET 带参数请求GET /user?page1size10代码StringresultwebClient.get().uri(uriBuilder-uriBuilder.path(/user).queryParam(page,1).queryParam(size,10).build()).headers(headers-{headers.setBearerAuth(token);headers.add(appId,1001);}).retrieve().bodyToMono(String.class).block();最终请求https://api.example.com/user?page1size10代码解析get()表示 GET 请求webClient.get()uri()请求地址。如果请求地址很简单可以这样写.uri(/user)headers()增加请求头可以在配置类里配置默认的请求头retrieve()开始发送请求并获取响应.retrieve()bodyToMono()响应转对象.bodyToMono(String.class)block()阻塞等待结果.block();注意WebClient 本身是异步的。调用.block()才会变成同步等待。十、GET 返回对象User 类DatapublicclassUser{privateLongid;privateStringname;}调用UseruserwebClient.get().uri(/user).retrieve().bodyToMono(User.class).block();如果带参数和请求头UseruserwebClient.get().uri(uriBuilder-uriBuilder.path(/user).queryParam(page,1).queryParam(size,10).build()).headers(headers-{headers.setBearerAuth(token);headers.add(appId,1001);}).retrieve().bodyToMono(User.class).block();通过 bodyToMono(User.class) Spring 会自动 JSON 转 User 对象。十一、POST 请求示例请求POST /user Content-Type: application/json请求体{name:张三,password:123,}DTODatapublicclassUserReq{privateStringname;privateStringpassword;}POST 代码UserReqreqnewUserReq();req.setName(张三);req.setPassword(123);StringtokenBearer xxxxxx;StringresultwebClient.post().uri(/user)//JSON 请求.contentType(MediaType.APPLICATION_JSON)//单次请求携带 Token. 可在配置类全局配置 Token.header(HttpHeaders.AUTHORIZATION,token).bodyValue(req).retrieve().bodyToMono(String.class).block();如果是表单请求.contentType(MediaType.APPLICATION_FORM_URLENCODED)bodyValue() 是什么它表示把对象转为请求体 JSON等价于{name:张三}十二、PUT 请求webClient.put().uri(/user/1).bodyValue(req).retrieve().bodyToMono(String.class).block();十三、DELETE 请求webClient.delete().uri(/user/1).retrieve().bodyToMono(String.class).block();十四、下载文件这是企业里非常常见的场景。下载文件为 byte[]byte[]datawebClient.get().uri(https://example.com/test.pdf)//如果需要携带token.header(HttpHeaders.AUTHORIZATION,Bearer xxxxxx).retrieve().bodyToMono(byte[].class).block();保存本地文件byte[]datawebClient.get().uri(https://example.com/test.pdf)//如果需要携带token.header(HttpHeaders.AUTHORIZATION,Bearer xxxxxx).retrieve().bodyToMono(byte[].class).block();Files.write(Paths.get(D:/test.pdf),data);大文件下载推荐流式如果文件很大 有几百 MB 或者 几 GB不推荐上面的 byte[] 下载否则可能 OOM内存溢出流式下载FluxDataBufferfluxwebClient.get().uri(/download/file).retrieve().bodyToFlux(DataBuffer.class);DataBufferUtils.write(flux,Paths.get(D:/big.zip),StandardOpenOption.CREATE).block();或者webClient.get().uri(https://example.com/big.zip).retrieve().bodyToFlux(DataBuffer.class).map(DataBuffer::asByteBuffer).doOnNext(buffer-{// 写入文件}).blockLast();十五、错误处理普通写法webClient.get().uri(/user).retrieve().bodyToMono(String.class)如果404 500会抛异常。onStatus 状态码错误处理StringresultwebClient.get().uri(/user).retrieve().onStatus(HttpStatusCode::is4xxClientError,response-Mono.error(newRuntimeException(4xx异常))).onStatus(HttpStatusCode::is5xxServerError,response-Mono.error(newRuntimeException(5xx异常))).bodyToMono(String.class).block();try-catchtry{StringresultwebClient.get().uri(/test).retrieve().bodyToMono(String.class).block();}catch(Exceptione){e.printStackTrace();}十六、retrieve() 和 exchangeToMono() 区别retrieve()最常用适合普通接口调用简洁开发简单场景.retrieve().bodyToMono(...)exchangeToMono()适合高级场景获取状态码获取响应头、cookie自定义响应处理StringresultwebClient.get().uri(/user).exchangeToMono(response-{if(response.statusCode().is2xxSuccessful()){returnresponse.bodyToMono(String.class);}returnMono.error(newRuntimeException(请求失败));}).block();十七、 WebClient适合场景与不适合场景非常适合微服务高并发API 网关聚合接口AI 调用并发请求多个服务SSE/流式响应不适合的场景如果你的项目完全同步 低并发 传统 MVC那么RestTemplate / RestClient可能更简单。社区里也有很多开发者提到WebFlux 会增加复杂度Mono / Flux 学习成本较高 (Reddit)十八、WebClient 学习路线建议按这个顺序学习WebClient 基础 APIMono / FluxReactor异步编程响应式编程Netty背压BackPressure十九、最常用写法总结1.GETwebClient.get()2.POSTwebClient.post()3.设置 header.header()4.设置 body.bodyValue()5.获取响应.retrieve().bodyToMono()6.阻塞等待.block()二十、完整实战示例封装 HttpClientServiceServicepublicclassHttpClientService{privatefinalWebClientwebClient;publicHttpClientService(WebClient.Builderbuilder){this.webClientbuilder.baseUrl(https://api.example.com).defaultHeader(HttpHeaders.CONTENT_TYPE,MediaType.APPLICATION_JSON_VALUE).build();}// GETpublicStringgetUser(){returnwebClient.get().uri(/user/1).retrieve().bodyToMono(String.class).block();}// POSTpublicStringlogin(LoginRequestrequest){returnwebClient.post().uri(/login).bodyValue(request).retrieve().bodyToMono(String.class).block();}// token请求publicStringgetWithToken(Stringtoken){returnwebClient.get().uri(/user/info).header(HttpHeaders.AUTHORIZATION,Bearer token).retrieve().bodyToMono(String.class).block();}}二十一、最后总结WebClient 本质上Spring 官方现代 HTTP 客户端它最大的特点非阻塞响应式高并发异步链式 API企业中现在越来越多微服务 WebClient的组合。但它的核心难点其实不是 WebClient 本身而是Mono / Flux / Reactor

相关文章:

SpringBoot WebClient 介绍

目录一、什么是 WebClient?二、 WebClient 能解决什么问题?三、WebClient 和 RestTemplate 的区别四、WebClient 的核心优势1. 非阻塞(Non-Blocking)2. 支持异步3. 链式 API 更现代五、WebClient 的核心对象六、Mono 和 Flux 是什…...

仅限首批200位架构师获取:DeepSeek-DDD联合建模工作坊实录(含领域事件风暴原始会议录像+决策日志)

更多请点击: https://kaifayun.com 第一章:DeepSeek领域驱动设计的范式演进与本质洞察 DeepSeek作为面向大规模智能体协同与复杂业务语义建模的新一代AI原生架构,其领域驱动设计(DDD)实践已突破传统分层单体范式&…...

CI/CD流水线中的幽灵依赖——DeepSeek项目92%存在未声明的transitive risk,你中招了吗?

更多请点击: https://intelliparadigm.com 第一章:CI/CD流水线中的幽灵依赖——DeepSeek项目92%存在未声明的transitive risk,你中招了吗? 在现代CI/CD实践中,开发者常误以为 package.json 或 requirements.txt 中显式…...

如何在原神中解放双手:自动钓鱼、拾取与对话跳过的终极指南

如何在原神中解放双手:自动钓鱼、拾取与对话跳过的终极指南 【免费下载链接】genshin-impact-script 原神脚本,包含自动钓鱼、自动拾取、自动跳过对话等多项实用功能。A Genshin Impact script includes many useful features such as automatic fishing…...

NBT数据可视化编辑解决方案:NBTExplorer技术解析与应用指南

NBT数据可视化编辑解决方案:NBTExplorer技术解析与应用指南 【免费下载链接】NBTExplorer A graphical NBT editor for all Minecraft NBT data sources 项目地址: https://gitcode.com/gh_mirrors/nb/NBTExplorer NBTExplorer是一款面向Minecraft数据管理的…...

PrediPrune:机器学习驱动的编译器超级优化候选剪枝策略

1. 项目概述与核心挑战在编译器优化的世界里,我们总在追求极致的性能。传统的编译器优化器,比如LLVM的Pass,依赖于一系列预定义的、经过验证的转换规则。它们很高效,但想象力也受限于这些规则。超级优化器(Superoptimi…...

终极指南:5步掌握Cursor AI Pro完整功能免费解锁技巧

终极指南:5步掌握Cursor AI Pro完整功能免费解锁技巧 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tria…...

3分钟终极指南:用ncmdump轻松解密网易云音乐NCM格式文件

3分钟终极指南:用ncmdump轻松解密网易云音乐NCM格式文件 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump正是解决这个问题的神器&…...

Python到Android的魔法之旅:5步将你的代码变成移动应用

Python到Android的魔法之旅:5步将你的代码变成移动应用 【免费下载链接】python-for-android Turn your Python application into an Android APK 项目地址: https://gitcode.com/gh_mirrors/py/python-for-android 想象一下,你花了几个月时间精心…...

Safe Exam Browser虚拟机绕过实战:深度解析与安全研究指南

Safe Exam Browser虚拟机绕过实战:深度解析与安全研究指南 【免费下载链接】safe-exam-browser-bypass A VM and display detection bypass for SEB. 项目地址: https://gitcode.com/gh_mirrors/sa/safe-exam-browser-bypass 在数字化教育快速发展的今天&…...

免费解锁AMD Ryzen隐藏性能:SMUDebugTool终极指南

免费解锁AMD Ryzen隐藏性能:SMUDebugTool终极指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcod…...

从SIM800到BK A7670E:4G Cat.1模块硬件平替转接板设计全解析

1. 项目概述:从2G到4G的硬件平替升级 手头有个老项目,用的还是SIM800这种经典的2G模块,现在网络环境变了,2G退网是大势所趋,信号覆盖越来越差,项目得活下去,升级到4G成了刚需。但问题来了&#…...

5分钟掌握AutoClicker:Windows鼠标点击自动化的终极指南

5分钟掌握AutoClicker:Windows鼠标点击自动化的终极指南 【免费下载链接】AutoClicker AutoClicker is a useful simple tool for automating mouse clicks. 项目地址: https://gitcode.com/gh_mirrors/au/AutoClicker AutoClicker是一款专为Windows设计的鼠…...

如何用OpenHRMS打造企业级人力资源管理系统:30+模块完全指南

如何用OpenHRMS打造企业级人力资源管理系统:30模块完全指南 【免费下载链接】OpenHRMS 项目地址: https://gitcode.com/gh_mirrors/op/OpenHRMS 还在为繁琐的人力资源管理头疼吗?🤔 面对员工考勤、薪酬计算、绩效评估等复杂流程&…...

如何高效使用HiveWE:魔兽争霸III地图制作的完整秘籍

如何高效使用HiveWE:魔兽争霸III地图制作的完整秘籍 【免费下载链接】HiveWE A Warcraft III world editor. 项目地址: https://gitcode.com/gh_mirrors/hi/HiveWE 还在为魔兽争霸III原版编辑器加载缓慢、操作卡顿而烦恼吗?HiveWE作为一款专注于速…...

三分钟快速上手:FanControl让你的电脑风扇从此安静又高效

三分钟快速上手:FanControl让你的电脑风扇从此安静又高效 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending…...

3分钟掌握抖音视频批量下载:解放双手的素材收集革命

3分钟掌握抖音视频批量下载:解放双手的素材收集革命 【免费下载链接】douyinhelper 抖音批量下载助手 项目地址: https://gitcode.com/gh_mirrors/do/douyinhelper 还在为一个个手动保存抖音视频而烦恼吗?想要高效收集创作者素材却苦于没有合适的…...

【独家首发】Sora 2 AVI支持并非“开箱即用”:3层封装校验机制详解(RIFF→AVI→OpenCV Mat内存映射链路图解)

更多请点击: https://codechina.net 第一章:Sora 2 AVI支持并非“开箱即用”:核心矛盾与技术定位 Sora 2 的官方文档与发布说明中明确将 AVI 视为“实验性容器支持”,而非默认启用的输入格式。其底层解码栈基于 FFmpeg 5.1 构建&…...

软件测试行业的未来趋势:这3类测试将成为主流

随着数字化转型的深入推进,软件已经成为驱动各行业变革的核心生产力,从自动驾驶汽车到企业级云原生平台,从智慧医疗设备到工业互联网系统,软件的复杂度、规模和对安全性的要求都在呈指数级增长。作为软件质量保障的核心环节&#…...

为开源项目OpenClaw配置Taotoken作为其大模型服务后端

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为开源项目OpenClaw配置Taotoken作为其大模型服务后端 OpenClaw 是一个功能强大的开源工具,它允许开发者便捷地调用各类…...

C语言预处理指令全解析

第六章 预处理命令在c语言中,所有# 开头的指令,被称为预处理指令。gcc 编译预处理 所有的预处理指令,都要在这步处理完汇编编译连接#include包含头文件。 全局变量的声明,函数的声明, 自定义构造类型声明, …...

AI算法工程师必学的Python库:这10个库,AI开发必备

对于软件测试从业者来说,随着人工智能技术在测试领域的渗透越来越深——从自动化测试用例生成到缺陷智能预测,从测试结果分析到测试环境智能化调度,掌握AI开发的核心工具链已经成为从功能测试向AI测试开发、智能化测试转型的核心竞争力。Pyth…...

终极艾尔登法环存档迁移指南:3分钟学会角色无损转移

终极艾尔登法环存档迁移指南:3分钟学会角色无损转移 【免费下载链接】EldenRingSaveCopier 项目地址: https://gitcode.com/gh_mirrors/el/EldenRingSaveCopier 还在为《艾尔登法环》存档迁移而烦恼吗?当游戏版本更新后,你辛辛苦苦培…...

安卓用户如何免费获取大模型API密钥并开始调用

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 安卓用户如何免费获取大模型API密钥并开始调用 对于安卓开发者或移动端技术爱好者而言,直接体验和调用多种大模型的能力…...

Windows键盘重映射终极指南:如何使用SharpKeys专业解决方案告别误触烦恼

Windows键盘重映射终极指南:如何使用SharpKeys专业解决方案告别误触烦恼 【免费下载链接】sharpkeys SharpKeys is a utility that manages a Registry key that allows Windows to remap one key to any other key. 项目地址: https://gitcode.com/gh_mirrors/sh…...

Playwright文件上传避坑指南:遇到动态生成的文件选择框怎么办?

Playwright文件上传避坑指南:动态生成文件选择框的实战解决方案最近在为一个电商平台做自动化测试时,遇到了一个棘手的问题——商品图片上传功能总是失败。页面上的"上传图片"按钮明明可以点击,但传统的set_input_files()方法却毫无…...

市面上有哪些是真正安全的降AIGC网站(轻松压低AI生成疑似率)

最崩溃的不是查重难题,而是查重达标却AI率超标亮红灯!很多工具只会简单同义词替换、浅层改字,根本洗不掉AI专属句式、行文逻辑和高频模板话术,学校AIGC检测一查一个准,论文直接凉凉。 本篇结合全网实测数据&#xff0c…...

3步高效解决TranslucentTB任务栏透明化难题:完整配置指南

3步高效解决TranslucentTB任务栏透明化难题:完整配置指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 你是否厌倦了Window…...

SHAP原理与特征贡献解析

SHAP(SHapley Additive exPlanations)是一种基于博弈论中Shapley值的模型解释方法,它为机器学习模型的预测提供了一种统一、理论完备的特征归因框架。其核心思想是将模型的预测值视为所有特征协同合作的“总收益”,然后公平地分配…...

Actor Framework里的“多米诺骨牌”:一个错误如何让整个嵌套操作者链崩溃?

Actor Framework中的“多米诺效应”:如何避免嵌套操作者链的崩溃 在分布式系统设计中,Actor模型因其天然的并发处理能力而备受青睐。LabVIEW的Actor Framework(AF)通过操作者(actor)的嵌套结构,为复杂系统提供了模块化解决方案。然而&#x…...