首页 > 其他分享 >接口设计中的版本号

接口设计中的版本号

时间:2023-08-23 20:34:23浏览次数:44  
标签:版本号 mapping springframework 接口 import 设计 ApiVersion

今天呢,闲来无事,想到了接口设计的版本号的一些知识,特此来简单的说下API接口设计中的Version版本号。

我们在接口的日常开发中,肯定都避免不了接口永成不变,那么就会出现接口变更,那么接口变更又是怎么区分的呢?接口变更又会不会对老接口有什么影响或者其他的呢,说了这么多,这就引出了一个版本号的概念,通过给API接口设置不同的版本号就可以达到区分接口的目的,版本号的定义在接口开发中又是百花齐放,我就一个小小的案例来尝试一下简单的用注解的方式定义版本的吧。

市面上目前主要定义版本号的实现主要有三种,第一种是通过接口路径定义的时候直接把Version版本号定义进去,第二种就是通过入参传递版本号以达到访问不同版本的接口,第三种就是设置请求头X-API-VERSION参数实现版本控制。这三种方式中我个人还是倾向于第一种接口路径版本号的方式,主要是这种方式简单直观清晰,并且实现起来也是非常简单的,下面我就第一种接口路径实现版本号的方式简单的用注解实现一下,当然直接写在路径中也可以,但是注解的方式更加显得正规一点。

1.定义版本号注解@ApiVersion

新建一个版本号注解@ApiVersion,用在类上或者方法上都可以,看自己需要。

package cn.youhaveme.version;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiVersion {
    String[] value();
}

2.创建一个ApiVersionMapping继承

RequestMappingHandlerMapping是根据类或方法上的@RequestMapping来生成 RequestMappingInfo的实例。那么我们通过实现registerHandlerMethod方法就可以自定义版本号的实现。通过读取@ApiVersion的版本号拼接上原有路径组成一个新的鞋带版本号的路径就可以实现这种注解式版本。

package cn.youhaveme.version;

import org.springframework.core.annotation.AnnotatedElementUtils;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

import java.lang.reflect.Method;

public class ApiVersionMapping extends RequestMappingHandlerMapping {
    @Override
    protected boolean isHandler(Class<?> beanType) {
        return AnnotatedElementUtils.hasAnnotation(beanType, Controller.class);
    }

    @Override
    protected void registerHandlerMethod(Object handler, Method method, RequestMappingInfo mapping) {
        Class<?> controllerClass = method.getDeclaringClass();
        // Controller的@ApIVersion注解
        ApiVersion apiVersion = AnnotationUtils.findAnnotation(controllerClass, ApiVersion.class);
        // 方法的@ApIVersion注解
        ApiVersion methodAnnotation = AnnotationUtils.findAnnotation(method, ApiVersion.class);
        // 方法上的注解优先级高于类上的注解
        if (methodAnnotation != null) {
            apiVersion = methodAnnotation;
        }
        String[] urlPatterns = apiVersion == null ? new String[0] : apiVersion.value();
        PatternsRequestCondition apiPattern = new PatternsRequestCondition(urlPatterns);
        PatternsRequestCondition oldPattern = mapping.getPatternsCondition();
        PatternsRequestCondition updatedFinalPattern = apiPattern.combine(oldPattern);
        mapping = new RequestMappingInfo(mapping.getName(), updatedFinalPattern, mapping.getMethodsCondition(),
                mapping.getParamsCondition(), mapping.getHeadersCondition(), mapping.getConsumesCondition(),
                mapping.getProducesCondition(), mapping.getCustomCondition());
        super.registerHandlerMethod(handler, method, mapping);
    }
}

3.全局配置

全局配置是让自定义的Mapping生效,正常的如果不配置这个的话自己的Mapping是无法生效的。

package cn.youhaveme.version;

import org.springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

@Configuration
public class ApiVersionConfig implements WebMvcRegistrations {
    
    @Override
    public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
        return new ApiVersionMapping();
    }
}

这样的话就已经实现了版本号的注解开发,如有需要,直接在Controller类上或者方法上使用@ApiVersion("v1")标记版本号即可,怎吗样,还是挺简单的吧。

标签:版本号,mapping,springframework,接口,import,设计,ApiVersion
From: https://blog.51cto.com/u_16167640/7206614

相关文章

  • OS(二十三):接口之系统调用
    操作系统是用户与计算机硬件系统之间的接口。OS向用户提供了用户接口和程序接口两类接口。用户接口:操作系统为用户提供的用户与操作系统的接口。程序接口:操作系统向编程人员提供程序与操作系统的接口。1、系统调用程序接口是OS专门为各用户程序设置的,是用......
  • pytestx重新定义接口框架设计
    概览脚手架:目录:用例代码:"""测试登录到下单流程,需要先启动后端服务"""test_data={"查询SKU":{"skuName":"电子书"},"添加购物车":{"skuId":123,"skuNum":......
  • Sentinel实现接口流量控制
    简介Sentinel是阿里巴巴开源的限流器熔断器,并且带有可视化操作界面。启动控制台下载地址java-Dserver.port=8089-Dcsp.sentinel.dashboard.server=localhost:8089-Dproject.name=sentinel-dashboard-jarsentinel-dashboard-1.8.6.jar注意不要使用windows下的PowerShel......
  • SIT1040Q 5V 供电,±40V 接口耐压,1Mbps 高速 CAN 总线收发器
    SIT1040Q是一款应用于CAN协议控制器和物理总线之间的接口芯片,可应用于卡车、公交、小汽车、工业控制等领域,速率可达到1Mbps,具有在总线与CAN协议控制器之间进行差分信号传输的能力。完全兼容“ISO11898”标准;符合AEC-Q100要求;内置过温保护;过流保护功能;显性超时......
  • API接口变更频繁,协作效率低?试试Apipost
    在团队协作开发和API管理过程中,API接口变更频繁、变更信息得不到及时同步且同步后沟通效率低,各个环节人员处理问题节奏不统一等等,都是在API开发中很多开发者面临的痛点。这些痛点可能会导致工作进度受阻、出现重复动作等多个问题,甚至给整个项目带来风险。这些问题在项目研发中是不......
  • 网络安全-修改基础接口配置(MSTP负载均衡)
    [s3-GigabitEthernet0/0/1]disthis#interfaceGigabitEthernet0/0/1portlink-typeaccessportdefaultvlan10#return[s3-GigabitEthernet0/0/1]portde [s3-GigabitEthernet0/0/1]portdefaultvlan1\^Error:Wrongparam......
  • 微信小程序调用微信接口报40001
    背景小程序登录需要获取手机号,调用该接口发现接口报错并返回错误码40001。该错误码官方解释:获取access_token时AppSecret错误,或者access_token无效。请开发者认真比对AppSecret的正确性,或查看是否正在为恰当的公众号调用接口。排查发现reids里的token缓存并没有过期,后面......
  • 拼多多app商品详情接口 获取pdd商品主图价格销量库存信息
    拼多多是中国一家知名的电商平台,以"社交+团购+新零售"的商业模式闻名,通过手机app和微信小程序等渠道提供商品销售和购物体验。平台上的商品种类丰富多样,涵盖了服装、家居、美妆、食品、数码电子等各个领域。拼多多的商业模式主要是基于团购和拼团的形式,用户可以邀请亲友们一起参......
  • CRUD接口_新增操作
        ......
  • CRUD接口_删除操作
         ......