【移动端】Mobile调用不同版本的Java接口

原文章:java后端 解决app接口版本管理问题


移动端版本迭代,需要调用不同版本的后台接口。

参考原文章,根据自己业务稍微修改下。

目前处理方式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 新创建接口没有版本号

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值