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

    文章

    7667

    浏览量

    148604
  • HTTP
    +关注

    关注

    0

    文章

    467

    浏览量

    30342

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    TSMaster 2024年1月最新版本,新功能太实用

    、新增TTS机箱模块、新增地图显示模块等。一大波超实用的新功能,一起来看看吧!体验新功能建议您将软件更新至最新版本TSMaster下载链接01工具箱相关更新工具箱模
    的头像 发表于 02-19 12:12 426次阅读
    TSMaster 2024年1月最<b class='flag-5'>新版本</b>,新功能太实用

    在esp8266中内置客户端WEB,请问有固件版本的要求吗?

    各位大神好!我想在8266中内置客户端WEB,请问有固件版本的要求吗?WEB内容是不是可以自己定制?有没有相关方面的资料吗?我在上看到《esp8266从零快速开发教程》,但是链接已经失效了,有没有相关的资料推荐,谢谢!
    发表于 11-08 08:07

    安信可Ai-WB2模组HTTP 客户端 POST请求方法

    文章目录 一、准备工作 二、连接路由器 三、HTTP客户端POST请求方法(适用于POST少量数据) 四、HTTP 客户端 POST 请求方法(推荐方式) 五、联系我们 01 准备工作
    的头像 发表于 10-30 17:27 352次阅读
    安信可Ai-WB2模组<b class='flag-5'>HTTP</b> <b class='flag-5'>客户端</b> POST请求方法

    AT32基于FreeRTOS的AWS MQTT客户端

    AT32基于FreeRTOS的AWS MQTT客户端建立一个MQTT客户端与 AWS IoT Core进行通讯,用户可以基于这个范例去开发属于自己的应用。
    发表于 10-26 06:03

    OPC UA SDK辅助设计工具最新动态

    广受好评的测试用OPC UA客户端工具UaExpert迎来更新,此次新版本中最重要的更新是其C++ SDK 更新到最新版本 1.7.7等内容,我们将在正文中为您详细介绍。
    的头像 发表于 08-24 15:00 433次阅读
    OPC UA SDK辅助设计<b class='flag-5'>工具</b>最新动态

    手把手教你OTA升级开发

    /updateservice# 升级服务代码仓目录 ├── interfaces # 升级客户端接口目录 │├── kits# 对外接口封装目录 ││└── js # 提供给升级客户端应用的JS 接口目录
    发表于 08-22 09:13

    EC-Master最新版本V3.2介绍

    EC-Master协议栈是一个经过精心设计和优化的主站协议栈产品,方便客户朋友更好地完成EtherCAT主站控制器的开发工作,支持在不同的嵌入式或非嵌入式(实时)操作系统上运行。现迎来最新版本V3.2更新
    的头像 发表于 08-18 14:00 838次阅读
    EC-Master最<b class='flag-5'>新版本</b>V3.2介绍

    HTTP客户端快速入门指南

    HTTP客户端快速入门指南
    发表于 07-03 18:38 0次下载
    <b class='flag-5'>HTTP</b><b class='flag-5'>客户端</b>快速入门指南

    M451的NuMicro ICP Programming Tool烧录工具新版本时钟源选项不见了是怎么回事?

    M451的NuMicro ICP Programming Tool烧录工具新版本时鐘源选项不见了,是否能加上这个选项,没有外加石英晶振时无法使用。
    发表于 06-13 06:00

    6月14日直播|嵌入式软件测试工具TPT 19新版本来啦!

    TPT是控制软件所有开发阶段的完美测试工具,无论您是单元测试、集成测试还是系统测试,TPT都能直观、灵活地完成这些测试。现在TPT迎来了新版本——TPT19,那么新版本都有哪些惊喜呢
    的头像 发表于 06-12 16:44 505次阅读
    6月14日直播|嵌入式软件测试<b class='flag-5'>工具</b>TPT 19<b class='flag-5'>新版本</b>来啦!

    ESP8266为什么不能根据来自客户端的连接触发新的html网页?

    我正在尝试在 ESP8266 上创建客户端程序以响应多个 html 网页;当客户选择按钮时。基本上不同的页面用于不同的 LED 控件集。我正在使用 WiFiClient 客户端创建与服务器的连接
    发表于 06-06 10:37

    新版本HyperLynx VX.2.13速览

    西门子EDA全球客户支持部门从2023年3月份开始推出客户关怀系列技术文章。本系列,我们的产品技术专家将结合电子系统设计软件的新功能和应用热点进行选题,本期主题为新版本HyperLynx VX.2.13速览,敬请参阅!
    的头像 发表于 05-25 17:37 1978次阅读
    <b class='flag-5'>新版本</b>HyperLynx VX.2.13速览

    当WiFi信号变低时,服务器和客户端之间的TCP通信丢失,如何使客户端重新连接?

    大家好, 当 WiFi 信号变低时,服务器和客户端之间的 TCP 通信丢失,比如超过 -80dBm。一旦客户端断开连接,它就无法重新连接并正常进行通信。如何让客户端在这里重新连接。
    发表于 05-15 07:31

    【文章转载】CANoe家族新版本17正式发布

    新版本持续为软件开发测试带来系列化的新功能:SIL全面支持DevOps和CI/CT流程中的工具功能、全新的10MB/s总线CANXL和10BASE-T1S解决方案、全新的IO测试硬件
    的头像 发表于 05-12 10:24 5039次阅读
    【文章转载】CANoe家族<b class='flag-5'>新版本</b>17正式发布