首页 > 其他分享 >Spring6之HTTP Interface分析

Spring6之HTTP Interface分析

时间:2023-02-15 10:59:31浏览次数:40  
标签:HTTP String 创建 UserApiService Spring Interface Spring6

目录

1 HTTP Interface

1.1 引言

近期,Spring 6 的第一个 GA 版本发布了,其中带来了一个新的特性——HTTP Interface。这个新特性,可以让开发者将 HTTP 服务,定义成一个包含特定注解标记的方法的 Java 接口,然后通过对接口方法的调用,完成 HTTP 请求。看起来很像使用 Feign 来完成远程服务调用,下面我们参考官方文档来完成一个 Demo

1.2 示例

1.2.1 创建服务端

首先创建一个简单的 HTTP 服务,这一步可以创建一个简单的 Spring Boot 工程来完成。

先创建一个实体类:

public class User implements Serializable {

    private int id;
    private String name;
    // 省略构造方法、Getter和Setter
    @Override
    public String toString() {
        return id + ":" + name;
    }
}

再写一个简单的 Controller:

@GetMapping("/users")
public List<User> list() {
    return IntStream.rangeClosed(1, 10)
            .mapToObj(i -> new User(i, "User" + i))
            .collect(Collectors.toList());
}

确保启动服务之后,能够从http://localhost:8080/users地址获取到一个包含十个用户信息的用户列表。

1.2.2 SpringBoot工程

下面我们新建一个 SpringBoot 工程
在这里插入图片描述

这里需要注意,Spring Boot 的版本至少需要是 3.0.0,这样它以来的 Spring Framework 版本才是 6.0 的版本,才能够包含 HTTP Interface 特性,另外,Spring Framework 6.0Spring Boot 3.0 开始支持的 Java 版本最低是 17,因此,需要选择至少是 17 的 Java 版本。
另外,需要依赖 Spring WebSpring Reactive Web 依赖

创建好新的 SpringBoot 工程后,首先需要定义一个 HTTPInterface 接口。最简单的定义如下即可:

public interface UserApiService {
    @GetExchange("/users")
    List<User> getUsers();
}

然后,我们可以写一个测试方法。

@Test
void getUsers() {
   WebClient client = WebClient.builder().baseUrl("http://localhost:8080/").build();
   HttpServiceProxyFactory factory = HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build();
   UserApiService service = factory.createClient(UserApiService.class);
   List<User> users = service.getUsers();
   for (User user : users) {
      System.out.println(user);
   }
}

最终回打印获取到的是个用户信息:

1:User1
2:User2
...
9:User9
10:User10

以上是一个最简单的示例,下面我们看看其中的一些细节。

1.3 深入分析

1.3.1 GetExchange(HttpExchange)

上文例子中的 GetExchange 注解代表这个方法代替执行一个 HTTP Get 请求,与此对应,Spring 还包含了其他类似的注解:
在这里插入图片描述

这些注解定义在spring-web模块的org.springframework.web.service.annotation包下,除了 HttpExchange 之外,其他的几个都是 HttpExchange 的特殊形式,这一点与 Spring MVC 中的 RequestMapping/GetMapping 等注解非常相似。

以下是 HttpExchange 的源码:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
@Reflective(HttpExchangeReflectiveProcessor.class)
public @interface HttpExchange {

    @AliasFor("url")
    String value() default "";

    @AliasFor("value")
    String url() default "";

    String method() default "";

    String contentType() default "";

    String[] accept() default {};

}

在上面的例子中,我们只指定了请求的资源路径。

1.3.2 UserApiService 实例创建

在上面例子中,我们定义的 HTTP Interface 接口是 UserApiService,在测试方法中,我们通过 HttpServiceProxyFactory 创建了 UserApiService 的实例,这是参考了 Spring 的官方文档的写法。
也可以将创建的过程写到一个 @Bean 方法中,从而可以将创建好的实例注入到其他的组件中。

我们再定义 UserApiService 的时候,只是声明了一个接口,那具体的请求操作是怎么发出的呢,我们可以通过 DEBUG 模式看得出来,这里创建的 UserApiService 的实例,是一个代理对象:
在这里插入图片描述

目前,Spring 还没有提供更方便的方式来创建这些代理对象,不过,之后的版本肯定会提供,如果感兴趣的话,可以从 HttpServiceProxyFactorycreateClient方法的源码中看到一些与创建 AOP 代理相似的代码,因此,我推测 Spring 之后可能会增加类似的注解来方便地创建代理对象。

1.4 其他特性

除了上述例子中的简单使用之外,添加了 HttpExchange 的方法还支持各种类型的参数,这一点也与 Spring MVCController 方法类似,方法的返回值也可以是任意自定义的实体类型(就像上面的例子一样),此外,还支持自定义的异常处理。

上面例子中为什么需要 Spring Reactive Web 的依赖
引入了 Spring Reactive Web 的依赖,在创建代理的service对象的时候,使用了其中的 WebClient 类型。这是因为,HTTP Interface 目前只内置了 WebClient 的实现,它属于 Reactive Web 的范畴。Spring 在会在后续版本中推出基于 RestTemplate 的实现。

标签:HTTP,String,创建,UserApiService,Spring,Interface,Spring6
From: https://www.cnblogs.com/jingzh/p/17121954.html

相关文章

  • o.a.http.impl.execchain.RetryExec execute关闭日志、
    o.a.http.impl.execchain.RetryExecexecute关闭日志对于logback,以下logback.xml将消除噪音:<loggername="org.apache"level="WARN"/><loggername="httpcli......
  • 真正“搞”懂HTTPS协议16之安全的实现
    上一篇噢,我们搞明白了什么是安全的通信,这个很重要,特别重要,敲黑板!!然后,我们还学了HTTPS到底是什么,以及HTTPS真正的核心SSL/TLS是什么。最后我们还聊了聊TLS的实现,也......
  • requests httpx post中json中文编码问题
    背景requests、httpxpost提交json数据时,默认在库中ensure_ascii为True。会对中文进行unicode编码。但是有的时候服务端并没有处理中文,没有进行解码,而我们又改不......
  • HTTPS基础原理和配置-2
    〇、概述作为概述,以下是本文要讲的内容。HTTPS是什么?每个人都可能从浏览器上认出HTTPS,并对它有好感。然后再讲一遍基础知识,再详细讲一下协议版本,密码套件(CipherSuites......
  • c++通过http协议校时
    由于IP黑白名单的限制,我们能访问的ip和域名资源非常有限,现将通过http协议授时方法整理如下: #include<cstdio>#include<string.h>#include<curl/curl.h>#inclu......
  • 云小课|使用SpringBoot快速构建FunctionGraph HTTP函数
    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。更多精彩内容请单击......
  • Nginx优化HTTPS提速30%
    在上一篇文章我们已经通过HTTP缓存优化静态文件访问速度,今天我们再来聊聊 HTTP协议优化 的问题。HTTP协议优化主要分为开启HTTP/2和ssl缓存优化,下面我们单独对这两种......
  • https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/repodata/r
    yum安装时,出现以下异常:yuminstall-ykubeletkubeadmkubectl#出现异常https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/repodata/repomd.......
  • C# Http 服务器get pos 请求 获取头信息 iOS 客户端联调
    usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Net;usingSystem.Text;usingUnityEngine;publicclassTestServerHttp:MonoBeh......
  • 系统环境变量中 HTTP_PROXY 的误区
    前段时间在测试一个连麦demo,demo简要说可以在内网环境中运行时,输入频道号就可以模拟连麦但是在加入连麦时,一直返回错误-2EOF,询问得知,该错误的解释信息是“ServiceUna......