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

    文章

    9443

    浏览量

    156125
  • HTTP
    +关注

    关注

    0

    文章

    531

    浏览量

    34848

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    嵌入式开发工具版本的选择策略

    ,很多时候,还会亲自下载安装尝鲜。 新版本有时候会引入一些bug,所以用新版本做项目一定要【慎重】,并不一定完全适合你的项目。 软件工具是否需要升级到最新版本?我的观点是:如果你做项
    发表于 11-25 06:11

    如何使用新版本J-Flash编程CW32 MCU

    1、从Segger公司官网下载安装最新版本JLink驱动,比如V7.96a,安装目录下没有JLinkDevices.xml文件。 2、在C:Users<用户名>
    发表于 11-12 07:24

    agile_ftp传输文件时客户端报错误怎么解决?

    ]客户端使用的filezilla [size=21.3333px] [size=21.3333px]现象: [size=21.3333px]filezilla客户端可以正常上传文件,但传输完毕时客户端会报
    发表于 11-05 10:49

    【直播预告】RT-Trace 全新版本发布|ITM输出 MemoryWatch 功能首发实测! | 问学直播

    RT-Trace迎来又一次重要更新!本次新版本来了两项备受期待的功能——ITM输出与MemoryWatch内存监控,让调试可视化更高效、问题定位更精准。为帮助开发者快速上手新特性
    的头像 发表于 10-14 11:57 347次阅读
    【直播预告】RT-Trace 全<b class='flag-5'>新版本</b>发布|ITM输出  MemoryWatch 功能首发实测! | 问学直播

    Python modbus-tk如何获得客户端信息?

    Python modbus-tk如何获得客户端信息
    发表于 08-07 06:01

    戴尔数据保护软件迎来全新版本

    无缝运行的异常检测,一站式监控多达150个系统,额外的MFA多重身份验证Dell PowerProtect Data Manager19.19全新版本现已到来!
    的头像 发表于 06-27 13:55 693次阅读

    普华基础软件开源汽车操作系统新版本代码上线

    近日,第二十一届上海国际汽车工业展览会现场,开源车用操作系统新版本代码上线仪式在中国电科展台成功召开。全球首个开源智能驾驶操作系统微内核龘EasyAda V2.1和首个规模化、量产级安全车控操作系统
    的头像 发表于 04-30 09:17 790次阅读

    普华基础软件开源车用操作系统迎来全新版本

    近日,普华基础软件开源车用操作系统媒体发布会在上海中国汽车会客厅召开——全球首个开源智能驾驶操作系统微内核龘EasyAda、开源安全车控操作系统小满EasyXMen全新版本正式发布。现场,普华基础软件开源项目技术团队专家就开源项目新版本技术亮点、新增功能及社区治理与运营等
    的头像 发表于 04-25 16:18 796次阅读

    网络传输利器索尼NXL-ME80 V1.2新版本发布

    网络传输利器NXL-ME80,凭借着高画质、高压缩比、低延时、高密度轻巧机箱,高冗余能力,一经上市就收到全球客户的大量好评。基于用户反馈和市场需求,NXL-ME80新版本V1.2强势来袭,必将为使用者带来更好的体验。
    的头像 发表于 04-23 14:37 871次阅读
    网络传输利器索尼NXL-ME80 V1.2<b class='flag-5'>新版本</b>发布

    SOA架构开发小助手PAVELINK.SOA-Converter 2.1.2新版本发布

    为提升汽车SOA架构设计开发效率,优化用户体验,我们对PAVELINK.SOA-Converter进行了全新升级。本次2.1.2新版本升级,聚焦于提升软件性能、扩展功能特性及增强用户交互体验。
    的头像 发表于 04-09 10:37 1249次阅读
    SOA架构开发小助手PAVELINK.SOA-Converter 2.1.2<b class='flag-5'>新版本</b>发布

    如何构建MCP客户端

    Anthropic开源了一套MCP协议,它为连接AI系统与数据源提供了一个通用的、开放的标准,用单一协议取代了碎片化的集成方式。本文教你从零打造一个MCP客户端
    的头像 发表于 03-20 09:32 2239次阅读
    如何构建MCP<b class='flag-5'>客户端</b>

    GUI Guider v1.9.0全新版本上线

    新年伊始,GUI Guider也迎来了新版本!这一次,我们带来了多项重磅更新,旨在为你提供更强大、更便捷的开发体验。无论你是工业控制、智能家居,还是消费电子领域的开发者,这些更新都将为你的项目注入新的活力!
    的头像 发表于 02-07 10:43 4500次阅读

    新版本 IDE 的启动速度变快了?原来是在背后做了这些!

    新版本 IntelliJ IDEA 中为提高性能而采取的措施,这些措施缩短了代码可交互时间并使 IDE 从启动开始就具有更高的响应速度。
    的头像 发表于 01-24 13:49 754次阅读
    <b class='flag-5'>新版本</b> IDE 的启动速度变快了?原来是在背后做了这些!

    HTTP 协议的工作原理

    的主要功能是使浏览器能够访问服务器上的资源,如网页、图片、视频等。 2. HTTP请求 HTTP请求是客户端(通常是浏览器)向服务器发出的请求。一个HTTP请求由以下几部分组成: 请求
    的头像 发表于 12-30 09:21 1591次阅读

    索尼发布空间现实显示播放器新版本

    索尼于2024年12月发布适用于空间现实显示屏ELF-SR1和ELF-SR2的空间现实显示播放器新版本
    的头像 发表于 12-24 15:19 946次阅读