来源:https://juejin.cn/post/717327...近日,Spring6第一个GA版本发布,带来了一个新特性——HTTP接口。这个新特性允许开发者将HTTP服务定义为一个Java接口,其中包含一个用特定注解标记的方法,然后通过调用该接口方法来完成HTTP请求。看起来很像使用Feign来完成远程服务调用。下面我们参考官方文档来完成一个demo。要完成一个Demo,首先要创建一个简单的HTTP服务。这一步可以通过创建一个简单的SpringBoot项目来完成。先创建一个实体类:publicclassUserimplementsSerializable{privateintid;私有字符串名称;//省略构造函数、Getter和Setter@OverridepublicStringtoString(){returnid+":"+name;}}然后编写一个简单的控制器:@GetMapping("/users")publicListlist(){returnIntStream.rangeClosed(1,10).mapToObj(i->newUser(i,"User"+我))。collect(Collectors.toList());}确保启动服务后,可以从http://localhost:8080/users地址获取包含十个用户信息的用户列表。让我们创建一个新的SpringBoot项目。SpringBoot的基础就不介绍了。推荐观看这个免费教程:https://github.com/javastacks/spring-boot-best-practice这里需要注意的是SpringBoot的版本至少需要3.0.0,这样它SpringFramework版本为6.0版本,可以包含HTTPInterface特性。另外,SpringFramework6.0和SpringBoot3.0支持的Java版本最低是17,所以需要选择至少17的Java版本。此外,还需要依赖SpringWeb和SpringReactiveWeb依赖,原因将在下文提及。新建一个SpringBoot项目后,首先需要定义一个HTTPInterface接口。最简单的定义如下:publicinterfaceUserApiService{@GetExchange("/users")ListgetUsers();}然后,我们可以写一个测试方法。@TestvoidgetUsers(){WebClientclient=WebClient.builder().baseUrl("http://localhost:8080/").build();HttpServiceProxyFactoryfactory=HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build();UserApiServiceservice=factory.createClient(UserApiService.class);列表<用户>用户=service.getUsers();对于(用户用户:用户){System.out.println(用户);是一条用户信息:1:User12:User2...9:User910:User10上面是最简单的例子,下面看一些细节。GetExchange(HttpExchange)注解上例中的GetExchange注解表示这个方法,而不是执行一个HTTPGet请求。相应的,Spring也包含了其他类似的注解:这些注解定义在spring-web模块的org.springframework.web中。service.annotation包下,除了HttpExchange,其他都是HttpExchange的特殊形式,与SpringMVC中的RequestMapping/GetMapping等注解非常相似。下面是HttpExchange的源码:@Target({ElementType.TYPE,ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documented@Mapping@Reflective(HttpExchangeReflectiveProcessor.class)public@interfaceHttpExchange{@AliasFor("url")字符串值()默认"";@AliasFor("value")Stringurl()default"";Stringmethod()默认"";StringcontentType()默认"";String[]accept()default{};}在上面的例子中,我们只是指定了请求的资源路径。UserApiService实例的创建在上面的例子中,我们定义的HTTPInterface接口是UserApiService。在测试方法中,我们通过HttpServiceProxyFactory创建了一个UserApiService实例,参考了Spring官方文档的写法。也可以将创建过程写成@Bean方法,这样创建的实例就可以注入到其他组件中。当我们再次定义UserApiService时,我们只是声明了一个接口。如何发出具体的请求操作?我们通过DEBUG模式可以看出,这里创建的UserApiService实例是一个代理对象:目前,Spring还没有提供更方便的创建这些代理对象的方式,不过以后的版本肯定会提供,如果有兴趣,从HttpServiceProxyFactory的createClient方法的源码中可以看到一些类似创建AOP代理的代码,所以推测Spring以后可能会加入类似的注解方便创建代理对象。其他特性除了上面例子中的简单使用之外,添加HttpExchange的方法还支持各种类型的参数,这也类似于SpringMVC的Controller方法,方法的返回值也可以是任意自定义实体类型(就像上面的例子一样),此外,还支持自定义异常处理。为什么需要SpringReactiveWeb依赖项?上面创建项目的时候,引入了SpringReactiveWeb依赖。创建代理服务对象时,使用了WebClient类型。这是因为HTTP接口目前只内置了WebClient的实现,属于ReactiveWeb的范畴。Spring会在后续版本推出基于RestTemplate的实现。总结本文让您简要了解HTTP接口功能。后面我会深入研究这个特性,也会在后续版本中跟踪分享改进。欢迎点赞关注。近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!