我们在日常开发中,经常会需要远程调用其他服务提供的接口,比较常用的 HTTP 远程代理框架有OpenFeign、Retrofit以及一些第三方封装工具类,例如Hutool提供的HttpUtil。
11月24日,Spring Boot 3正式发布,Spring官方已经自身支持使用声明式服务调用的方式来调用远程接口。
虽然类似的远程调用框架如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
。
方法参数
返回值
声明性 HTTP 接口支持以下返回值:
使用示例
@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文章
8564浏览量
150992 -
HTTP
+关注
关注
0文章
504浏览量
31164
原文标题:替换OpenFeign,Spring 新版本自带的 HTTP 客户端工具来了!
文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论