美文网首页
通过header控制接口版本

通过header控制接口版本

作者: 程序员Darker | 来源:发表于2021-10-30 20:57 被阅读0次

自定义指定接口版本注解

/**
 * @author wangningbo
 */
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface APIVersion {
    String value();

    String headerKey() default "version";
}

继承RequestCondition实现自定义

/**
 * 自定义 RequestCondition
 *
 * @author wangningbo
 */
public class APIVersionCondition implements RequestCondition<APIVersionCondition> {
    
    @Getter
    private String apiVersion;
    @Getter
    private String headerKey;

    public APIVersionCondition(String apiVersion, String headerKey) {
        this.apiVersion = apiVersion;
        this.headerKey = headerKey;
    }

    @Override
    public APIVersionCondition combine(APIVersionCondition other) {
        return new APIVersionCondition(other.getApiVersion(), other.getHeaderKey());
    }

    @Override
    public APIVersionCondition getMatchingCondition(HttpServletRequest request) {
        String version = request.getHeader(headerKey);
        return apiVersion.equals(version) ? this : null;
    }

    @Override
    public int compareTo(APIVersionCondition other, HttpServletRequest request) {
        return 0;
    }
}

继承 RequestMappingHandlerMapping 实现自定义

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

    @Override
    protected RequestCondition<APIVersionCondition> getCustomTypeCondition(Class<?> handlerType) {
        APIVersion apiVersion = AnnotationUtils.findAnnotation(handlerType, APIVersion.class);
        return createCondition(apiVersion);
    }

    @Override
    protected RequestCondition<APIVersionCondition> getCustomMethodCondition(Method method) {
        APIVersion apiVersion = AnnotationUtils.findAnnotation(method, APIVersion.class);
        return createCondition(apiVersion);
    }

    private RequestCondition<APIVersionCondition> createCondition(APIVersion apiVersion) {
        return apiVersion == null ? null : new APIVersionCondition(apiVersion.value(), apiVersion.headerKey());
    }
}

使用自定义注解控制版本

    @APIVersion("1.0")
    @ApiOperation(value = "单个查询", notes = "1.0版本")
    @GetMapping("/id/{id}")
    public CategoryVO getById(@PathVariable Long id) {
    }

    @APIVersion("2.0")
    @ApiOperation(value = "单个查询", notes = "2.0版本")
    @GetMapping("/id/{id}")
    public CategoryVO getById2(@PathVariable Long id) {
    }

相关文章

  • 通过header控制接口版本

    自定义指定接口版本注解 继承RequestCondition实现自定义 继承 RequestMappingHand...

  • Yii2基于header实现版本控制

    Yii2 官方给出的方案是基于url的版本控制,但是我们的versoin放在header里面,需要通过header...

  • RESTful Service Best Practices:

    服务版本控制: 借助header:Accept 和 header: ContentType 实现 For exam...

  • Laravel5 版本设置

    不同版本的访问是通过 header中的 Accept 去控制(需要先开启API_STRICT):需要注意的是Acc...

  • 通过HTTP Header控制缓存

    我们经常通过缓存技术来加快网站的访问速度,从而提升用户体验。HTTP协议中也规定了一些和缓存相关的Header,来...

  • 通过HTTP Header控制缓存

    我们经常通过缓存技术来加快网站的访问速度,从而提升用户体验。HTTP协议中也规定了一些和缓存相关的Header,来...

  • 给移动端强制更新的接口

    app版本控制表 版本实体类 写给移动端的判断版本信息的接口 service接口 接口实现类 这里AppVersi...

  • restful 接口版本控制

    做RESTful开放平台,一方面其API变动越少,对API调用者越有利;另一方面,没有人可以预测未来,系统在发展的...

  • 接口测试

    request.js 请求的header配置 token是通过/account/p-login-done.do接口...

  • SpringBoot 优雅控制API版本

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

网友评论

      本文标题:通过header控制接口版本

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