Spring 新声明式 HTTP 客户端:HTTP Interface + RestClient,把“调用外部 API”写成接口

1. 核心概念:HTTP Service Clients(HTTP Interface)

它的本质是两件事:(Home)

  1. 用接口定义“我要调用的 HTTP API”(方法上标注@GetExchange等)
  2. HttpServiceProxyFactory基于底层 HTTP 客户端(RestClient/WebClient/RestTemplate)生成代理对象

额外有个很实用的点:如果这个 API 是你们自己的服务,服务端的@Controller甚至可以实现同一份接口,做到“契约复用”。(Home)

2. 版本关系:6、6.1、7 分别带来了什么

  • Spring 6:引入接口式的@HttpExchange声明调用能力(Home)
  • Spring 6.1:引入RestClient(新的同步 HTTP 客户端),API 风格像WebClient,底层复用RestTemplate的 converters、拦截器等基础设施(Home)
  • Spring 7:为了解决“接口多了以后 Bean 配置很重复”的问题,加入Registry + 分组(group)的配置模型,并提供@ImportHttpServices自动注册代理 Bean(Home)

3. 最小闭环:写一个接口 + 生成代理(Spring 6+ 都能用)

3.1 定义接口

importorg.springframework.web.service.annotation.GetExchange;importorg.springframework.web.service.annotation.HttpExchange;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RequestParam;@HttpExchange(url="/api")publicinterfaceTodoClient{@GetExchange("/todos/{id}")TodogetTodo(@PathVariable("id")longid);@GetExchange("/todos")List<Todo>list(@RequestParam("owner")Stringowner);}

Spring 文档明确:@HttpExchange可放在类型上做统一配置,方法上用@GetExchange / @PatchExchange ...补齐具体动作;方法参数支持@PathVariable@RequestHeader@RequestParam等。(Home)

3.2 生成代理(以 RestClient 为底座,同步)

importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.client.RestClient;importorg.springframework.web.client.support.RestClientAdapter;importorg.springframework.web.service.invoker.HttpServiceProxyFactory;@ConfigurationpublicclassClientConfig{@BeanpublicTodoClienttodoClient(){RestClientrestClient=RestClient.builder().baseUrl("https://example.com").defaultHeader("Accept","application/json").build();HttpServiceProxyFactoryfactory=HttpServiceProxyFactory.builderFor(RestClientAdapter.create(restClient)).build();returnfactory.createClient(TodoClient.class);}}

这就是官方给出的标准套路:RestClientAdapter/WebClientAdapter/RestTemplateAdapter+HttpServiceProxyFactory。(Home)

4. 返回值怎么选:同步 or 响应式,一眼看懂

Spring 文档对“返回值支持哪些类型”给了一个非常清晰的表:(Home)

  • 当底层是RestClient / RestTemplate(同步)时,你可以返回:

    • T(直接反序列化成对象)
    • ResponseEntity<T>(要状态码、头、body)
    • HttpHeadersvoid
  • 当底层是WebClient时,除了上面的同步返回,还支持响应式:Mono<T>Flux<T>Mono<ResponseEntity<T>>

有个实用补充:RestClientAdapter还额外支持InputStreamResponseEntity<InputStream>,适合下载类场景。(Home)

5. 全局错误处理:别在业务里到处 try/catch

默认 4xx/5xx 会抛异常,但你可以在底层客户端统一定制:

  • RestClient.Builder.defaultStatusHandler(...)
  • WebClient.Builder.defaultStatusHandler(...)
  • RestTemplate.setErrorHandler(...)

文档还给了示例代码框架(推荐你把异常映射做在这里,业务层就干净了)。(Home)

另外,如果你希望“404 不算异常,直接返回空对象/NOT_FOUND”,还可以通过adapter decorator做统一策略(文档提供了现成装饰器思路)。(Home)

6. 规模化:接口多了之后,用 Group + Registry 管起来(Spring 7)

当你接入多个外部系统(比如 GitHub、支付、短信、ERP),如果还按“一个接口写一个@Bean createClient”,配置会爆炸。Spring 7 引入了HTTP Service Registry:按 group 组织接口,框架自动生成代理并注册为 Bean。(Home)

6.1 用@ImportHttpServices声明分组(自动注册代理 Bean)

@ImportHttpServices是 Spring 7 新增(javadoc 标注 Since: 7.0),支持types手动列出接口或按包扫描。(Home)

6.2 每个 group 统一配置底层客户端

Spring 文档给出HttpServiceGroupConfigurer的使用方式:你可以按 group 名字定制clientBuilder,也可以对所有 group 做统一处理。(Home)

更关键的是:Spring Boot 还能基于 group 注入“按组的客户端配置属性”;Spring Security 可以加 OAuth;Spring Cloud 可以加负载均衡。(Home)

如果同一接口在多个 group 里各有一份代理(比如两个不同环境/不同租户的 host),你还可以直接从HttpServiceProxyRegistry按 group 拿到指定代理。(Home)

7. 测试怎么做

如果你底层用RestClient,Spring 官方明确提到:可以通过MockRestServiceServer来测试它的使用方式。(Home)
工程上常见做法是:

  • 单元测试:mock 接口代理(因为它就是个接口)
  • 集成测试:MockRestServiceServer / WireMock(把外部服务模拟出来)
  • 契约测试:把接口当“调用契约”,配合服务端的实现做回归验证(尤其适合内部微服务)

8. 最佳实践清单(我建议你直接照这个落地)

  • 每个外部系统一个 group:统一 baseUrl、超时、鉴权 header、日志拦截器
  • DTO 与接口放在单独 module:让“契约”稳定、可复用、可测试
  • 错误处理集中在底层:defaultStatusHandler统一映射业务异常(别散落在 Service 层)(Home)
  • 同步优先用 RestClient:写起来更短更顺,且它就是为了同步场景提供的现代 API(Home)
  • 需要流式/背压/端到端响应式才用 WebClient:接口返回Mono/Flux,避免“响应式里 block”(Home)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1200285.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java_ssm10二手汽车销售系统n7v1m

目录 具体实现截图系统概述技术架构核心功能模块系统特色应用价值 系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 具体实现截图 系统概述 Java_SSM10二手汽车销售系统是基于SSM&#xff08;SpringSpringMVC…

2026全国靠谱拍摄剪辑培训机构哪个比较好

作为一个从零基础转行做短视频行业的过来人,真的太懂大家想学拍摄剪辑,却被五花八门的教学机构搞懵的心情了!现在短视频、直播火得一塌糊涂,拍摄剪辑早就不是“兴趣爱好”,而是能变现、能转行的硬技能——我查过《…

Excel数据检测大师:ISBLANK与ISLOGICAL函数实战指南

如何从杂乱的数据中快速识别空白项和逻辑值&#xff1f;这两个函数能帮你建立数据质量检查的第一道防线&#xff01; 一、核心函数解析&#xff1a;数据质量的守门员 1. ISBLANK函数 - 空白检测专家 ISBLANK(单元格引用) 功能&#xff1a;判断指定单元格是否为空。如果是真正空…

java_ssm11办公电子政务管理系统 上下班考勤打卡系统

目录 具体实现截图办公电子政务管理系统与上下班考勤打卡系统摘要 系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 具体实现截图 办公电子政务管理系统与上下班考勤打卡系统摘要 办公电子政务管理系统是基于…

​工信部发布人形机器人标准化指南,博银合创落地工业具身智能实验室,Meta发布V-JEPA 2世界模型,博世与OpenAI深化合作

工信部发布人形机器人标准化体系指南&#xff0c;推动产业规模化发展 国新办发布会上&#xff0c;工信部明确宣布将正式印发《人形机器人与具身智能综合标准化体系建设指南》&#xff0c;同步加大国家人工智能产业基金扶持力度&#xff0c;推进开源社区建设&#xff0c;破解行…

2026年西安发泡混凝土厂家靠谱推荐陕西曲益存建筑工程有限公司-深耕发泡混凝土领域

发泡混凝土是一种通过在水泥浆料中引入大量均匀、封闭的气泡而制成的轻质多孔材料。它结合了混凝土的耐久性和泡沫的轻质性,在现代建筑和工程中应用广泛。一、西安发泡混凝土厂家陕西曲益存建筑工程有限公司top实力解…

让机器人拥有本能反应!清华开源:一套代码实现跑酷、野外徒步两大能力

清华大学交叉信息研究院与上海期智研究院联合推出的Project-Instinct框架&#xff0c;给出了一个新答案。 如何让机器人同时具备“本能反应”与复杂运动能力&#xff1f; 清华大学交叉信息研究院与上海期智研究院联合推出的Project-Instinct框架&#xff0c;给出了一个新答案…

java_ssm2 甜品蛋糕店商城销售管理系统_7sp39

目录 具体实现截图系统概述技术架构核心功能模块创新与优化应用价值 系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 具体实现截图 系统概述 Java_SSM2甜品蛋糕店商城销售管理系统是一款基于SSM&#xff08;…

6G基站与终端协作感知关键技术报告:基站与终端协作,解锁高精度感知一体化未来

摘要&#xff1a;本报告基于3GPP 6G标准化进展&#xff0c;揭秘基站与终端协作感知的核心逻辑&#xff1a;通过“基站广覆盖终端泛在分布”优势互补&#xff0c;实现高精度、全场景感知&#xff0c;为通信行业从业者、技术研发人员、政策制定者提供全景式技术指南。6G 时代的协…

马斯克下场抢人!xAI组建「人才狙击队」,极客版HR年薪168万

xAI认为&#xff0c;想从常规人才市场招真正的顶尖人才&#xff0c;没戏。还得靠熟人推荐、线下活动、竞赛选拔、特定线上社区&#xff0c;以及各种更具创造性的渠道。马斯克要亲自下场抢人了。最新消息&#xff0c;xAI正组建一支「AI人才狙击队」&#xff0c;直接向马斯克汇报…

回收微信立减金前必读清单,避开陷阱,安全操作指南

信立减金是日常消费的“隐形福利”,可不少人因闲置或额度溢出想将其回收变现。但微信立减金回收市场良莠不齐,隐私泄露、资金损失等风险暗藏。这份必读清单,助你安全完成回收。 一、确认关键信息,避免资源浪费 回收…

java_ssm3旅行日记旅行攻略分享系统

目录 具体实现截图基于SSM框架的旅行日记与攻略分享系统设计与实现 系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 具体实现截图 基于SSM框架的旅行日记与攻略分享系统设计与实现 该系统采用Java语言开发&a…

Java版LeetCode热题100之不同路径:从动态规划到组合数学的全面解析

Java版LeetCode热题100之不同路径&#xff1a;从动态规划到组合数学的全面解析 本文深入剖析 LeetCode 第62题「不同路径」&#xff0c;这是一道经典的网格路径计数问题。文章涵盖题目理解、动态规划&#xff08;二维与一维&#xff09;、组合数学三种解法、代码实现、复杂度分…

【开题答辩全过程】以 基于Springboot 的水果售卖系统的设计与开发为例,包含答辩的问题和答案

个人简介 一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等 开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。 感谢大家…

构建自主同城配送平台,开源跑腿小程序系统的核心优势

温馨提示&#xff1a;文末有资源获取方式对于希望摆脱平台高额抽成、建立独立品牌与客户关系的创业者而言&#xff0c;一套功能完备、自主可控的技术方案至关重要。源码获取方式在源码闪购网。完全独立的品牌运营与用户沉淀系统支持私有化部署与全套UI自定义&#xff08;包括小…

适合不同年龄段家长管控孩子手机的APP哪个口碑好

问题1:什么样的家长管控APP才算有实力?核心标准是什么? 家长管控APP的实力并非靠宣传噱头堆砌,而是要能真正解决青少年沉迷手机的核心痛点,落地到功能层面,至少要满足精准管控、防规避、易操作、数据透明四大核心…

java_ssm9二手书回收平台 捐赠 购物车 积分兑换统计

目录 具体实现截图摘要 系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 具体实现截图 摘要 Java_SSM9二手书回收平台是一个基于SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架开发的在线交易系统&a…

支持所有自定义数据时间段查询与导出的跑腿小程序源码系统

温馨提示&#xff1a;文末有资源获取方式在竞争激烈的同城配送领域&#xff0c;精细化运营是制胜关键。本文将深入解析一款专为数据化运营设计的开源同城跑腿小程序源码系统。该系统不仅提供标准化的跑腿业务框架&#xff0c;更通过一系列智能管理功能&#xff0c;赋能运营者实…

北京璞新工业设计设计能力如何,排名情况大汇总

在医疗设备与机器人产业加速升级的当下,专业的工业设计已成为企业产品差异化竞争的核心驱动力。面对市场上良莠不齐的工业设计服务商,如何找到既懂技术又懂市场的合作伙伴?以下结合不同服务类型,为你推荐2026年值得…

java_ssm4 校园招聘管理系统_echmf

目录 具体实现截图校园招聘管理系统摘要 系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 具体实现截图 校园招聘管理系统摘要 校园招聘管理系统基于Java SSM框架&#xff08;SpringSpringMVCMyBatis&#xf…