w88优德_优德88官网_优德88电子游戏

首页w88正文

脂肪瘤图片,怎么高雅的规划 Spring Boot API 接口版本号-w88优德

admin3周前168浏览量

一般来说,体系上线今后,需求仍会发作变化,功用也会迭代更新。可能是接口参数发作改变,也有可能是事务逻辑需求调整,假如直接在本来的接口上进行修正,必然会影响原有服务的正常运转。

常见的解决方案,是在接口途径中参加版别号用于区别,此外还能够在参数乃至 header 里带上版别号。这儿以在恳求途径中带上版别号为例,如:http://IP:PORT/api/v1/test ,v1 即代表的是版别号。当然了,能够像这样,直接写死在 @RequestMapping("api/v1/test") 特点中,不过下面供给了更为高雅的解决方案。

  • 自界说版别号符号注解
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ApiVersion {
/**
* 标识版别号,从1开端
*/
int value() default 1;
}
  • 重写相应的 RequestCondition
@Data
@Slf4j
public class ApiVersionCondition implements RequestCondition {
/**
* 接口途径中的版别号前缀,如: api/v[1-n]/test
*/
private final static Pattern VERSION_PREFIX_PATTERN = Pattern.compile("/v(\\d+)/");
private int apiVersion;
ApiVersionCondition(int apiVersion) {
this.apiVersion = apiVersion;
}
@Override
public ApiVersionCondition combine(ApiVersionCondition other) {
// 最近优先准则,办法界说的 @ApiVersion > 类界说的 @ApiVersion
return new ApiVersionCondition(other.getApiVersion());
}
@Override
public ApiVersionCondition getMatchingCondition(HttpServletRequest request) {
Matcher m = VERSION_PREFIX_PATTERN.matcher(request.getRequestURI());
if (m.find()) {
// 取得契合匹配条件的ApiVersionCondition
int version = Integer.valueOf(m.group(1));
if (version >= getApiVersion()) {
return this;
}
}
return null;
}
@Override
public int compareTo(ApiVersionCondition other, HttpServletRequest request) {
// 当呈现多个契合匹配条件的ApiVersionCondition,优先匹配版别号较大的
return other.getApiVersion() - getApiVersion();
}
}
  • 重写部分 RequestMappingHandlerMapping 的办法
@Slf4j
public class CustomRequestMappingHandlerMapping extends RequestMappingHandlerMapping {
@Override
protected RequestCondition
// 扫描类上的 @ApiVersion
ApiVersion apiVersion = AnnotationUtils.findAnnotation(handlerType, ApiVersion.class);
return createRequestCondition(apiVersion);
}
@Override
protected RequestCondition
// 扫描办法上的 @ApiVersion
ApiVersion apiVersion = AnnotationUtils.findAnnotation(method, ApiVersion.class);
return createRequestCondition(apiVersion);
}
private RequestCondition createRequestCondition(ApiVersion apiVersion) {
if (Objects.isNull(apiVersion)) {
return null;
}
int value = apiVersion.value();
Assert.isTrue(value >= 1, "Api Version Must be greater than or equal to 1");
return new ApiVersionCondition(value);
}
}
  • 装备注册自界说的 CustomRequestMappingHandlerMapping
@Slf4j
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Override
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
return new CustomRequestMappingHandlerMapping();
}
}
  • 编写接口,符号上相应的 @ApiVersion
@Slf4j
@ApiVersion
@RestController
@RequestMapping("api/{version}/test")
public class TestController {
@GetMapping
public String test01(@PathVariable String version) {
return "test01 : " + version;
}
@GetMapping
@ApiVersion(2)
public String test02(@PathVariable String version) {
return "test02 : " + version;
}
}
  • 发动 Application,测验及检查成果

最终针对于java程序员价值上万架构视频材料免费共享给我们(包含Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术材料),希望能协助到且找到一个好的作业,也节约我们在网上查找材料的时刻来学习,也能够重视我一下今后会有更多干货共享。要材料请私信回复:获取免费材料!!

最新评论