美文网首页SpringBoot
SpringBoot 优雅控制API版本

SpringBoot 优雅控制API版本

作者: 极简博客 | 来源:发表于2022-08-20 10:08 被阅读0次

在实际工作中,由于接口功能做了不兼容变更,因此需要在原接口基础上增加版本控制,以示区分。

何时进行版本控制?这里引用REST API版本控制描述

只有在进行重大更改时才需要对API进行升级。突破性变化包括:

  • 一个或多个调用的响应数据格式的变化
  • 响应类型的更改(即将整数更改为float)
  • 删除API的任何部分。

中断更改应始终导致更改API或内容响应类型的主版本号。

不间断更改(例如添加新端点或新响应参数)不需要更改主版本号。但是,在进行更改以跟踪可能正在接收缓存版本数据或可能遇到其他API问题的客户时,跟踪API的次要版本会很有帮助。

1. 常见版本控制策略

方式 说明
子域名 不同版本使用不同域名,v1.test.com,v2.test.com
请求URL 同一域名,不同路径,test.com/v1/,test.com/v2/
请求参数 根据参数区分相应功能

2. 设计建议

  • 历史版本的支持需要有一定时间限制,超时将不再支持,否则随着新版本的不断迭代,维护将是一件头疼的事情。
  • 尽量将功能的颗粒度降到最低,降低功能间的耦度。
  • 新版本建议分类存储,在线API文档避免杂乱无章,可考虑分组展示。

3. 实现

通过重写RequestMappingHandlerMapping更改URL分发

  • 核心实现
public class VersionConfig extends WebMvcConfigurationSupport {
    /**
     * 注解@Version(2)将分发至 /v2/** 默认: /v1/** || /**
     *
     * @param contentNegotiationManager
     * @param conversionService
     * @param resourceUrlProvider
     * @return
     */
    @Override
    public RequestMappingHandlerMapping requestMappingHandlerMapping(ContentNegotiationManager contentNegotiationManager, FormattingConversionService conversionService, ResourceUrlProvider resourceUrlProvider) {
        return new RequestMappingHandlerMapping() {
            @Override
            protected RequestMappingInfo getMappingForMethod(Method method, Class<?> type) {
                RequestMappingInfo rmi = super.getMappingForMethod(method, type);
                if (Objects.isNull(rmi)) {
                    return null;
                }
                Version version = Optional.ofNullable(AnnotationUtils.findAnnotation(method, Version.class)).orElseGet(() -> AnnotationUtils.findAnnotation(type, Version.class));
                return Objects.nonNull(version)
                        ? RequestMappingInfo.paths(Arrays.stream(version.value()).mapToObj(i -> "v" + i).toArray(String[]::new)).build().combine(rmi)
                        : RequestMappingInfo.paths(new String[]{"v1", ""}).build().combine(rmi);
            }
        };
    }
}

示例代码

相关文章

  • SpringBoot 优雅控制API版本

    在实际工作中,由于接口功能做了不兼容变更,因此需要在原接口基础上增加版本控制,以示区分。 何时进行版本控制?这里引...

  • ehcache 3.5.x 配置文件说明

    环境版本: ehcache版本3.5.2 SpringBoot版本2.0.4 JCache API版本1.1.0 ...

  • SpringBoot 2.x API 版本控制

    之前有文章讲述在Spring MVC 中扩展 RequestMappingHandlerMapping 实现对版本...

  • API版本控制

    服务API的版本控制历来没有一个完美的解决方案,本篇列出了业界常见的三类API版本控制方案,每一类中又有1到2种实...

  • api版本控制

    我们假设API接口的域名名为api.tp5.com,并且以两个版本v1和v2为例(注意,版本号仅为主版本,小版本应...

  • java.lang.NoSuchMethodError: jav

    一、启动SpringBoot失败,异常信息如下 二、解决 servlet-api版本太低,升级即可剔除旧版本 配置新版本

  • Spring Boot自定义Banner

    我们在启动 SpringBoot 时,控制台会打印 SpringBoot Logo 以及版本信息;这个操作是 Sp...

  • SpringBoot自定义启动Banner在线生成工具,以及操作

    我们在启动 SpringBoot 时,控制台会打印 SpringBoot Logo 以及版本信息;这个操作是可以通...

  • PHP-API接口版本控制的问题

    api 接口版本控制找了一下资料总共有几种类型 不设定版本模式意味着每个API只提供一个版本,如果要修改本API,...

  • RESTful API如何进行版本控制

    本文将帮助您理解为什么需要版本控制,以及如何对REST API进行版本控制。我们将讨论4种版本控制的方法,并比较不...

网友评论

    本文标题:SpringBoot 优雅控制API版本

    本文链接:https://www.haomeiwen.com/subject/ribpgrtx.html