0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

替换OpenFeign,Spring新版本自带的HTTP客户端工具来了!

jf_ro2CN3Fa 来源:Java知音 2023-01-05 09:59 次阅读


我们在日常开发中,经常会需要远程调用其他服务提供的接口,比较常用的 HTTP 远程代理框架有OpenFeign、Retrofit以及一些第三方封装工具类,例如Hutool提供的HttpUtil。

11月24日,Spring Boot 3正式发布,Spring官方已经自身支持使用声明式服务调用的方式来调用远程接口。

7be31692-8c63-11ed-bfe3-dac502259ad0.png

虽然类似的远程调用框架如OpenFeign和Retrofit仍然可以使用,但HttpServiceProxyFactory增加了对 Spring 框架的原生支持。如果Spring本身可以做到远程调用的话,这些大量的第三方库应该很快会被原生方法取代,我们今天来了解一下这个新特征。

声明式 Http 接口

声明性 HTTP 接口可以让你像定义Java接口那样定义HTTP服务,用法和你平时写Controller中方法完全一致。

引入

声明性 HTTP 接口功能是spring-web依赖项的一部分,使用前必须引入如下依赖包:

<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>

<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webfluxartifactId>
dependency>

创建 HTTP 服务接口

在 Spring 中,HTTP 服务接口是一个带有@HttpExchange方法的 Java 接口。注释方法被视为 HTTP 端点,细节通过注释属性和输入方法参数类型静态定义。

支持的注解类型

  • @HttpExchange :是用于指定 HTTP 端点的通用注释。在接口级别使用时,它适用于所有方法。
  • @GetExchange :为 HTTP GET请求指定@HttpExchange
  • @PostExchange :为 HTTP POST请求指定@HttpExchange
  • @PutExchange :为 HTTP PUT请求指定@HttpExchange
  • @DeleteExchange :为 HTTP DELETE请求指定@HttpExchange
  • @PatchExchange :为 HTTP PATCH请求指定@HttpExchange

方法参数

7bf13cb8-8c63-11ed-bfe3-dac502259ad0.png

返回值

声明性 HTTP 接口支持以下返回值:

7bfbfcca-8c63-11ed-bfe3-dac502259ad0.png

使用示例

@PutExchange
voidupdate(@PathVariableLongid,@RequestBodyUseruser);

完整使用案例

我们以一个简单的用户信息请求为例

0、构建HttpServiceProxyFactory

HttpServiceProxyFactory是一个从 HTTP 服务接口创建客户端代理的工厂类。使用HttpServiceProxyFactory.builder(client).build()方法来获取代理 bean 的实例。

importcom.fasterxml.jackson.databind.ObjectMapper;
importcom.howtodoinjava.app.web.UserClient;
importlombok.SneakyThrows;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.web.reactive.function.client.WebClient;
importorg.springframework.web.reactive.function.client.support.WebClientAdapter;
importorg.springframework.web.service.invoker.HttpServiceProxyFactory;
@Configuration
publicclassWebConfig{
@Bean
WebClientwebClient(ObjectMapperobjectMapper){
returnWebClient.builder()
.baseUrl("https://jsonplaceholder.typicode.com/")
.build();
}
@SneakyThrows
@Bean
UserClientpostClient(WebClientwebClient){
HttpServiceProxyFactoryhttpServiceProxyFactory=
HttpServiceProxyFactory.builder(WebClientAdapter.forClient(webClient))
.build();
returnhttpServiceProxyFactory.createClient(UserClient.class);
}
}

1、定义一个简单的用户信息实体类:

publicclassUser{

privateintid;

privateStringusername;

privateStringpassword;

//省略

}

2、请求接口:

importcom.howtodoinjava.app.model.User;
importorg.springframework.http.ResponseEntity;
importorg.springframework.web.bind.annotation.PathVariable;
importorg.springframework.web.bind.annotation.RequestBody;
importorg.springframework.web.service.annotation.DeleteExchange;
importorg.springframework.web.service.annotation.GetExchange;
importorg.springframework.web.service.annotation.HttpExchange;
importorg.springframework.web.service.annotation.PostExchange;
importorg.springframework.web.service.annotation.PutExchange;
importreactor.core.publisher.Flux;
importreactor.core.publisher.Mono;
@HttpExchange(url="/users",accept="application/json",contentType="application/json")
publicinterfaceUserClient{
@GetExchange("/")
FluxgetAll();
@GetExchange("/{id}")
MonogetById(@PathVariable("id")Longid);
@PostExchange("/")
Mono>save(@RequestBodyUseruser);
@PutExchange("/{id}")
Mono>update(@PathVariableLongid,@RequestBodyUseruser);
@DeleteExchange("/{id}")
Mono>delete(@PathVariableLongid);
}

3、将UserClient bean 注入应用程序类并调用方法来获取 API 响应:

@Autowired
UserClientuserClient;
//GetAllUsers
userClient.getAll().subscribe(
data->log.info("User:{}",data)
);
//GetUserById
userClient.getById(1L).subscribe(
data->log.info("User:{}",data)
);
//CreateaNewUser
userClient.save(newUser(null,"Lokesh","lokesh","admin@email.com"))
.subscribe(
data->log.info("User:{}",data)
);
//DeleteUserById
userClient.delete(1L).subscribe(
data->log.info("User:{}",data)
);

完工,不需要定义方法实现就能进行远程HTTP调用,非常方便!



审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    8474

    浏览量

    150768
  • HTTP
    +关注

    关注

    0

    文章

    501

    浏览量

    31013

原文标题:替换OpenFeign,Spring 新版本自带的 HTTP 客户端工具来了!

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    经纬恒润INTEWORK-VBA新版本正式发布

    和前后端信息传递的压力。面对这一问题,经纬恒润积极响应市场需求,正式推出INTEWORK-VBAV3系列新版本,整合仿真、诊断、标定和测试等多个应用场景,一站式解
    的头像 发表于 11-01 08:00 245次阅读
    经纬恒润INTEWORK-VBA<b class='flag-5'>新版本</b>正式发布

    IBM发布面向企业的人工智能模型新版本

    近日,IBM正式发布了其面向企业的人工智能模型——Granite 3.0的最新版本,旨在抓住当前企业纷纷拥抱生成式AI技术的热潮。与IBM Granite系列中的其他AI模型一样,Granite 3.0也将采取开源策略,这与微软等竞争对手向客户收取模型访问
    的头像 发表于 10-22 17:32 419次阅读

    万兴科技旗下Wondershare Filmora发布V14全新版本

    近日,万兴科技旗下的视频创意软件Wondershare Filmora桌面,正式面向全球市场发布了其备受期待的V14全新版本。此次升级不仅带来了多项创新功能,还进一步提升了软件的专业性和易用性,满足了广大视频创作者对高效、高质
    的头像 发表于 10-08 15:33 502次阅读

    品英Pickering最新版本的微波开关设计工具, 增强了仿真能力和原理图设计功能

    这 款免 费 在 线 工具的最新版本将在 EuMW 2024(9 月 24 日至 26 日,法国巴黎)上首次亮相,该版本的开关配置功能尤为突出。   2024年9月25日,英国
    发表于 09-25 09:05 127次阅读
    品英Pickering最<b class='flag-5'>新版本</b>的微波开关设计<b class='flag-5'>工具</b>,  增强了仿真能力和原理图设计功能

    经纬恒润INTEWORK-TPA 新版本正式发布

    正式推出INTEWORK-TPA5.2.0新版本,以科技的力量,为用户带来更智能的体验升级!▎AI助力,高效测试新版本的AI小助理上线了!借助她的AI大模型能力,测试
    的头像 发表于 08-30 11:46 407次阅读
    经纬恒润INTEWORK-TPA <b class='flag-5'>新版本</b>正式发布

    GUI Guider V1.8.0全新版本正式上线

    在这个充满创新与挑战的时代,我们深知高效、灵活的GUI设计工具对人机交互应用的重要性。经过几个月的精心打磨与测试,GUI Guider V1.8.0全新版本正式上线了!本次更新不仅带来了前所未有的设计自由度,更在功能优化与用户体
    的头像 发表于 08-02 09:26 624次阅读

    如何获取连接的TCP客户端的ESPCONN指针?

    我几乎阅读了 SDK API 指南版本 1.0.1 的所有文档 并开始了解如何添加用户 AT 命令。 这真的很简单,只需拨打at_cmd_array_register。 BUT! 如何获取连接的 TCP 客户端的 ESPCONN 指针?
    发表于 07-12 14:54

    新增6个实用功能!华秋DFM新版本来了

    市场反馈,致力于为广大工程师用户带来更稳定、更高效的功能体验。在此次4.2新版本中,我们不仅优化了一系列核心功能,大幅提升了软件性能,还根据大家的反馈新增了几项实用工具
    的头像 发表于 07-05 08:07 877次阅读
    新增6个实用功能!华秋DFM<b class='flag-5'>新版本来了</b>

    无法在Modustoolbox 3.2工具类别中找到客户端控制应用程序,如何解决?

    我最近从 2.4 版升级到了 MTB 3.2 版 我为 343026 BSP 添加了一些示例 但我无法在工具类别中找到客户端控制应用程序。 如何才能解决问题?
    发表于 05-22 07:50

    谷歌DeepMind发布人工智能模型AlphaFold最新版本

    谷歌DeepMind近日发布了人工智能模型AlphaFold的最新版本——AlphaFold 3,这一革命性的工具将在药物发现和疾病治疗领域发挥巨大作用。
    的头像 发表于 05-10 11:26 547次阅读

    CANoe新版本18正式发布

    新版本持续为电动智能软件开发测试带来系列化的新功能,新版本CANoe产品体系包括具有GUI交互的桌面版本、可部署在服务器后云端的服务器版本、HIL台架专业
    的头像 发表于 05-09 08:25 3059次阅读
    CANoe<b class='flag-5'>新版本</b>18正式发布

    关于博达透传工具新版本升级公告

    感谢您一直以来对博达智联自主研发的远程透传工具的支持与信任!为提升广大用户的操作体验,博达智联团队经过不懈努力,不断优化产品功能,将透传工具进行了全面的升级,即刻发出全新版本。相比于之前的版本
    的头像 发表于 03-19 08:33 423次阅读
    关于博达透传<b class='flag-5'>工具</b><b class='flag-5'>新版本</b>升级公告

    适用于Linux的基于Rust的同步客户端介绍

    一个简单而优雅的 GUI 同步客户端,提供双向同步。
    的头像 发表于 01-05 11:32 572次阅读
    适用于Linux的基于Rust的同步<b class='flag-5'>客户端</b>介绍

    分享一款别样的ssh客户端-PortX

    目前支持ssh的客户端有很多,比如putty、crt、xshell等,今天分享一款别样的ssh客户端-PortX,通过简单但全面的UI,PortX为您提供了纯粹的终端模拟体验。
    的头像 发表于 01-02 13:37 646次阅读
    分享一款别样的ssh<b class='flag-5'>客户端</b>-PortX

    鸿蒙原生应用/元服务开发-新版本云一体化模板体验反馈

    总的来说,最新版本云一体化模板确实方便了开发者自行搭建项目,极大地简化了开发者在这上面的时间浪费。同时对应用功能的开发搭建也缩短了不少时间。 期待后续更新更多的开发模板把!
    发表于 12-05 14:57