全国服务热线:4008-888-888

公司新闻

h5 免费-Spring Boot入门系列(二十一)如何优雅的

--------

h5 免费

------- 当今部位: > 技术性实例教程 Spring Boot入门系列(二11)怎样优雅的设计方案 Restful API 插口版本号号,完成 API 版本号操纵! - 章为忠 - blog园 来源于: 作者: 浏览次数:93
Spring Boot入门系列(二11)怎样优雅的设计方案 Restful API 插口版本号号,完成 API 版本号操纵!

有些人将会会问,为何我看到许多企业的api插口文本文档里边,都有/api/v1/ 这样的详细地址呢?实际上,/api 就是以便和一般的业务流程详细地址区别,标出这个详细地址是api 的插口。v1 则意味着版本号号。

将会许多人又会问了,为何要版本号号呢?那末,接下来就聊一聊Restful 插口为何要加版本号号? 怎样优雅的设计方案 Restful API 插口版本号号?

 

一、为何加版本号号

一般来讲,api 插口是出示给别的系统软件或是别的企业应用,不可以随便经常的变动。但是,要求和业务流程不断转变,插口和主要参数也会产生相应的转变。假如立即对原先的插口开展改动,必然会危害线别的系统软件的一切正常运作。这就务必对api 插口开展合理的版本号操纵。

例如,加上客户的插口,因为业务流程要求转变,插口的字段特性也产生了转变并且将会和之前的作用不适配。以便确保原来的插口启用方不会受到危害,只能再次界定一个新的插口。

api/v1/user api/v2/user

 

Api 版本号操纵的方法:

1、网站域名区别管理方法,即不一样的版本号应用不一样的网站域名,v1.,v2.

2、恳求url 相对路径区别,/api/v1/,/api/v2

3、恳求主要参数区别,在同一url相对路径下,提升version=v1或v2 等,随后依据不一样的版本号,挑选实行不一样的方式。

具体新项目中,一般挑选第二种:恳求url相对路径区别。由于第二种既能确保水平拓展,有不危害之前的老版本号。

 

二、Spring Boot怎样完成

完成计划方案:

1、。

2、随后建立自定的 RequestMappingHandlerMapping 配对对应的request,挑选合乎标准的method handler。

 

1、建立自定注释

最先,在com.weiz.config 包下,建立一个自定版本号号标识注释 @ApiVersion。

<.weiz.config; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; * API版本号操纵注释 @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface ApiVersion { * @return 版本号号 int value() default 1; }

表明:

 ApiVersion 为自定的注释,API版本号操纵,回到对应的版本号号。

 

2、自定url配对逻辑性

建立 ApiVersionCondition 类,并承继RequestCondition 插口,功效是:版本号号挑选,将提取恳求URL中版本号号,与注释上界定的版本号号开展比对,以此来分辨某个恳求应落在哪一个controller上。

在com.weiz.config 包下建立ApiVersionCondition 类,重新写过 RequestCondition,建立自定的url配对逻辑性。

<.weiz.config; .springframework.web.servlet.mvc.condition.RequestCondition; import javax.servlet.http.HttpServletRequest; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ApiVersionCondition implements RequestCondition ApiVersionCondition { private final static Pattern VERSION_PREFIX_PATTERN = pile(".*v(\\d+).*"); private int apiVersion; ApiVersionCondition(int apiVersion) { this.apiVersion = apiVersion; private int getApiVersion() { return apiVersion;
@Override bine(ApiVersionCondition apiVersionCondition) { return new ApiVersionCondition(apiVersionCondition.getApiVersion()); @Override public ApiVersionCondition getMatchingCondition(HttpServletRequest httpServletRequest) { Matcher m = VERSION_PREFIX_PATTERN.matcher(httpServletRequest.getRequestURI()); if (m.find()) { Integer version = Integer.valueOf(m.group(1)); if (version = this.apiVersion) { return this; return null; @Override pareTo(ApiVersionCondition apiVersionCondition, HttpServletRequest httpServletRequest) { return apiVersionCondition.getApiVersion() - this.apiVersion; }

当方式级別和类级別都有ApiVersion注释时,bine)。最后将提取恳求URL中版本号号,与注释上界定的版本号号开展比对,分辨url是不是合乎版本号要求。

 

3、自定配对的解决器

在com.weiz.config 包下建立 ApiRequestMappingHandlerMapping 类,重新写过一部分 RequestMappingHandlerMapping 的方式。

<.weiz.config; .springframework.web.bind.annotation.RequestMapping; .springframework.web.servlet.mvc.condition.RequestCondition; .springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; import java.lang.reflect.Method; public class ApiRequestMappingHandlerMapping extends RequestMappingHandlerMapping { private static final String VERSION_FLAG = "{version}"; private static RequestCondition ApiVersionCondition createCondition(Class ? clazz) { RequestMapping classRequestMapping = clazz.getAnnotation(RequestMapping.class); if (classRequestMapping == null) { return null; StringBuilder mappingUrlBuilder = new StringBuilder(); if (classRequestMapping.value().length 0) { mappingUrlBuilder.append(classRequestMapping.value()[0]); String mappingUrl = mappingUrlBuilder.toString(); if (!mappingUrl.contains(VERSION_FLAG)) { return null; ApiVersion apiVersion = clazz.getAnnotation(ApiVersion.class); return apiVersion == null ? new ApiVersionCondition(1) : new ApiVersionCondition(apiVersion.value()); @Override protected RequestCondition ? getCustomMethodCondition(Method method) { return createCondition(method.getClass()); @Override protected RequestCondition ? getCustomTypeCondition(Class ? handlerType) { return createCondition(handlerType); }

 

4、配备申请注册自定的RequestMappingHandlerMapping

重新写过恳求过解决的方式,将之前建立的 ApiRequestMappingHandlerMapping 申请注册到系统软件中。

<.weiz.config; .springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations; .springframework.context.annotation.Configuration; .springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; @Configuration public class WebMvcRegistrationsConfig implements WebMvcRegistrations { @Override public RequestMappingHandlerMapping getRequestMappingHandlerMapping() { return new ApiRequestMappingHandlerMapping(); }

上面四步,把api 版本号操纵配备完了。编码看着繁杂,实际上都是重新写过spring boot 內部的解决步骤。

 

配备进行以后,接下来编写检测的操纵器开展检测。

1、在Controller/api 文件目录下,各自建立UserV1Controller 和 UserV2Controller

UserV1Controller

@RequestMapping("api/{version}/user")
@RestController
public class UserV1Controller {
 @GetMapping("/test")
 public String test() {
 return "version1";
 @GetMapping("/extend")
 public String extendTest() {
 return "user v1 extend";
}

 

UserV2Controller

@RequestMapping("api/{version}/user")
@RestController
@ApiVersion(2)
public class UserV2Controller {
 @GetMapping("/test")
 public String test() {
 return "user v2 test";
}

 

2、起动新项目后,键入有关详细地址,查询版本号操纵是不是起效

检测結果:

正确的插口详细地址

 

 

承继的插口详细地址

表明:

上图的前两个截图表明,恳求正确的版本号详细地址,会全自动配对版本号的对应插口。当恳求的版本号超过当今版本号时,默认设置配对当今版本号。

第三个截图表明,当恳求对应的版本号不存在插口时,会配对之前版本号的插口,即恳求/v2/user/extend 插口时,因为v2 操纵器未完成该插口,因此全自动配对v1 版本号中的插口。这就是所谓的版本号承继。

以上,就把Spring Boot 怎样优雅的设计方案 Restful API 插口版本号号,完成 API 版本号操纵详细介绍完了。版本号操纵和管理权限认证是rest api 的基本,尽管看着比较繁杂,可是了解了,要完成還是比较简易的。

这个系列课程的详细源代码,也会出示给大伙儿。大伙儿关心我的手机微信微信公众号(构架师精进),回应:springboot源代码。获得这个系列课程的详细源代码。

 

---------

h5 免费

------------


在线客服

关闭

客户服务热线
4008-888-888


点击这里给我发消息 在线客服

点击这里给我发消息 在线客服