移动端版本迭代,需要调用不同版本的后台接口。
参考原文章,根据自己业务稍微修改下。
目前处理方式Java重写请求拦截器
1.首先创建声明拦截器
这里我只拦截请求中带mobile的url
@Configuration
public class MVCConfig implements WebMvcConfigurer {
@Bean
public VersionInterceptor versionInterceptor() {
return new VersionInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
// addPathPatterns方法添加拦截
registry.addInterceptor(versionInterceptor())
.addPathPatterns("/mobile/**");
}
}
2.配置接口版本
/**
* 配置多版本的接口
* 根据版本号进行接口匹配
* @author
*/
public class VersionMap {
private HashMap<String,String> urls=new HashMap<>();
private VersionMap(){
//此处配置接口数据(接口,版本列表 逗号隔开 模式 v1-vn)
urls.put("/mobile/test","v1,v2");
urls.put("/mobile/test1","");
}
private static class SingletonInstance {
private static final VersionMap INSTANCE = new VersionMap();
}
public static VersionMap getInstance() {
return SingletonInstance.INSTANCE;
}
public HashMap<String, String> getUrls() {
return urls;
}
public void setUrls(HashMap<String, String> urls) {
this.urls = urls;
}
}
3.重写HandlerInterceptor接口
/**
* 版本拦截器
*
* @author
* @date 2021-12-21 15:38:43
*/
public class VersionInterceptor implements HandlerInterceptor {
/**
* 接口版本拦截器
* 对指定的接口进行版本连接
* 根据cookie中javaVersion转发到不同的版本接口中
* request中的参数以最终对应接口的参数为准
* 向下兼容模式
* 最大容错模式
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
String apiVersion = request.getHeader("apiVersion");
// 如果请求没传入版本号,按照最低版本走,即请求的地址。
if (apiVersion == null || apiVersion.isEmpty()) {
//无版本传入默认最低版本(向下兼容模式)
return true;
}
// 获取请求的url
String url = request.getServletPath();
// 判断请求中是否携带后续拼接的".do",携带放行。
if(!url.contains(".do")){
VersionMap versionUrl = VersionMap.getInstance();
// 接口版本类获取 当前接口有几个版本。
String versions = versionUrl.getUrls().get(url);
// 判断版本管理中是否有app端传过来的版本,没匹配到版本 按照最大版本算。
if (versions.contains(apiVersion)) {
// url拼接, 请求url + / + 版本号 + .do 上层判断会用".do判断"
url = url + "/" + apiVersion + ".do";
} else {
// 判断接口是否为新创建。(业务需求 新创建的接口不带版本号)
String[] versionUrls = versions.split(",|,");
if("".equals(versionUrls[versionUrls.length - 1])){
return true;
}
//传入当前版本不在注册中,返回最后一个版本
url = url + "/" + versionUrls[versionUrls.length - 1] + ".do";
}
//携带参数进行转发
request.getRequestDispatcher(url).forward(request, response);
return false;
}
return true;
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
Object o, Exception e) throws Exception {
}
}
3.1 这里定义个"apiVersion" 通过请求时在Headers获取
4.创建接口
@RestController
@RequestMapping("mobile")
public class HomeController {
@PostMapping("/test")
public String get(@RequestBody JSONObject json){
System.out.println(json);
return "测试"+json;
}
@PostMapping("/test/v1.do")
public String pist(@RequestBody JSONObject json){
System.out.println(json);
return "测试v1------"+json;
}
@PostMapping("/test/v2.do")
public String aa(@RequestBody Map<String,Object> map){
System.out.println(map.get("name"));
return "测试v2-----"+map.get("name");
}
@PostMapping("/test1")
public String get1(@RequestBody JSONObject json){
System.out.println(json);
return "测试1"+json;
}
}
5.接口测试
5.1 没有传递版本号的情况
5.2 传递版本号"v1"
5.3 传递版本号"v2"
5.4 传递版本号"v3"
5.5 新创建接口没有版本号