当app迭代时需要,java后端的接口也可能会迭代。
相同的接口,传参和处理方式都会不懂,如果在代码中做向下兼容不可行了,就需要写多个接口进行版本区分。当版本接口不多时,可以通过接口传参然后判断来实现,但是版本接口过多时,在接口中做判断就会效率低下。
但是多个接口暴露出去是同一个访问路径。这样对于app端是察觉不到的。
这里采用拦截器和转发模式,进行请求分发。

首先定义统一接口的版本命名,这里采用v加数字的形式

@RestController
@RequestMapping("/test")
public class TestController {@PostMapping("/test")
public String get(String name){return "测试"+name;
}@PostMapping("/test/v1")
public String pist(String name){System.out.println(name);return "测试v1------"+name;
}
@PostMapping("/test/v2")
public String aa(@RequestBody Map<String,Object> map){System.out.println(map.get("name"));return "测试v2-----"+map.get("name");
}
}

然后创建一个类,进行版本的接口注册

/**
* 配置多版本的接口* 根据版本号进行接口匹配* @author liudong*/
public class VersionMap {
private HashMap<String,String> urls=new HashMap<>();
private VersionMap(){//此处配置接口数据(接口,版本列表 逗号隔开 模式 v1-vn)urls.put("/test/test","v1,v2");
}
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;
}
}

然后写核心实现 VersionInterceptor拦截器

/*** 版本拦截器* @author liudong*/
public class VersionInterceptor implements HandlerInterceptor{/*** 接口版本拦截器* 对指定的接口进行版本连接* 根据cookie中javaVersion转发到不同的版本接口中* request中的参数以最终对应接口的参数为准* 向下兼容模式* 最大容错模式*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception {Cookie[] aa = request.getCookies();//后台版本String javaVersion="";//app版本String appVersion="";//设备String equipment="";if (aa==null){LoggerTools.addInfoLogger("javaVersion");}if (("javaVersion").equals(aa[0].getName().trim())){javaVersion=aa[0].getValue();}else {//无版本传入默认最低版本(向下兼容模式)return true;}String url = request.getServletPath().split("\\.")[0];VersionMap versionUrl = VersionMap.getInstance();String versions = versionUrl.getUrls().get(url);//默认最大版本if (versions.contains(javaVersion)){url = url+"/"+javaVersion+".do";}else {//传入当前版本不在注册中,返回最后一个版本String[] versionUrls = versions.split(",|,");url= url+"/"+versionUrls[versionUrls.length-1];}//携带参数进行转发request.getRequestDispatcher(url).forward(request,response);return false;
}@Override
public void postHandle(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,Object o, ModelAndView modelAndView) throws Exception {}@Override
public void afterCompletion(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,Object o, Exception e) throws Exception {}
}

这里采用cookie进行数据传输,也可以采用其他方式,比如session之类的。
这里的接口后面需要加.do进行情况,所有截取方式请按具体情况进行区分。

我们将最终的接口版本与app端协定,app端在cookie中放置javaVersion。我们获取进行版本管理。

过滤器转发规则:
当没有指定参数传入时,访问初始接口 /test
当有参数传入时,访问指定接口,
当传入参数,不在注册列表时,访问最终版本接口。
所以版本接口的注册书写是按顺序,从左到右,从旧到新的。

接口的版本命名规则。
同一个接口不是按规则的。
接口的版本命名是根据java发布的版本进行命名的。
比如有两个接口 /a 和 /b
/a已经发布了三版 /a/v1 /a/v2
但是/b没有更新过
下一个版本时
/b要更新了
/b 的下一版命名应该是 /b/v3
如果是/b/v1 或者 /b/v2 时
上一版app传入的是v2
/a 接口访问的是/a/v2
/b 接口访问的应该是/b 而不是/b/v1
所以/b接口的下一版命名应该是在最大的版本号的基础上加一 /b/v3

java后端 解决app接口版本管理问题相关推荐

  1. html小Demo: js调用java后端提供的接口

    文章目录 html小Demo: js调用java后端提供的接口 html常用的一些标签(初级版)以及对html的一些理解的笔记 head常用标签 body常用标签 JavaScript Java sp ...

  2. java后端解决重复提交问题

    一.为什么会出现重复提交? 主要是由于网络的延迟问题以及页面刷新的操作. 二.表单的重复提交会导致的问题? 主要能够造成很多脏数据. 三.解决的办法: 3.1 前端解决办法:通过前端的方法将提交按钮变 ...

  3. java后端请求第三方接口并处理HttpEntity类转换成实体类对象

      最近在写使用java后端去请求第三方接口的代码,给大家分享关于HttpEntity类的处理方式,而处理请求是需要根据第三方的要求来处理的,所以这里着重展示HttpEntity的处理.   在开始代 ...

  4. java后端解决跨域问题

    首先我门要知道什么是跨域: 跨域是指 不同域名之间相互访问.跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制. 也就是如果在A网站中 ...

  5. Java后端返回通用接口设计

    我印象中,通用返回接口设计是有两种方式,第一种是自定义返回数据的通用类,另一种是springboot中实现ResponseBodyAdvice接口,实现返回数据格式的统一,如我说的有错,请大佬指出.本 ...

  6. Java后端解决前后端跨域的3种方法

    1.在方法上使用@CrocsOrigin注解 2.在配置类包内添加一个返回值为CorsFilter过滤器的配置类 package com.example.springboot.config;impor ...

  7. java后端实现集成支付宝APP支付(沙箱环境)

    沙箱环境集成支付宝APP支付后端实现 前言 获取支付宝相关信息 整体开发流程 1.获取核心参数 2.将支付宝SDK集成到项目中 3.后台使用支付宝SDK与支付宝进行交互逻辑 1.将支付宝公共信息参数写 ...

  8. 解决“微信小程序http请求参数为空时,传到java后端变成了undefined”问题

    遇到问题: 最近在对接微信小程序和java后端springboot框架的接口,然后发现一个问题,当微信小程序发起http请求时,如果请求参数的值为空,传到java后端时就变成了undefined,这样 ...

  9. vue+Java后端进行调试时如何解决跨域问题

    今天在开发过程中遇到一个问题,拿到了一套vue代码,计划对这套代码的部分样式进行调整,Java后端代码已经写好并且部署到了线上.这时命令行运行vue项目时访问会受限,取不下数据来,遇到了跨域访问失败的 ...

  10. vue 解决跨域 调试_vue+Java后端进行调试时解决跨域问题的方式

    今天在开发过程中遇到一个问题,拿到了一套vue代码,计划对这套代码的部分样式进行调整,Java后端代码已经写好并且部署到了线上.这时命令行运行vue项目时访问会受限,取不下数据来,遇到了跨域访问失败的 ...

最新文章

  1. .NET : 再谈谈XML中的命名空间问题
  2. 我国第一台微型计算机诞生于哪一年,2015计算机一级《MSOffice》章节练习题及答案(1)...
  3. 推荐八款来自极客标签的超棒前端特效[第八期]
  4. pip国内镜像源速度几十倍于官方及如何设置
  5. 表达式求值问题 数据结构_【每日一题51】实际问题与一次函数 看图象求表达式 由表达式求值...
  6. python list tuple 打包 解包_python的打包与解包
  7. 错误提示:ssh: Could not resolve hostname devsrv: Name or service not known
  8. [转载]windows 7 IIS 7.5 ASP.Net 文件上传大小限制
  9. C#实现所有CRC8,CRC16,CRC32校验算法
  10. 怎么把动图分解成图片?gif怎么拆分成几张?
  11. 导线电感、走线电感、过孔电感计算公式
  12. 你每天都在使用的HTTP协议,到底是什么鬼?
  13. MATLAB读二进制数据文件
  14. 科技进步计算机开机速度,笔者教你电脑开机慢怎么办
  15. APIC Timer
  16. 云呐|固定资产计提折旧怎么算
  17. 解读:基于图卷积特征的卷积神经网络的股票趋势预测(文末赠书)
  18. Win10系统打开photoshop提示错误16 如何解决?
  19. 【论文阅读】Alignment-Robust Cancelable Biometric Scheme for Iris Verification
  20. 数论概论 第五章 习题解答(下) (宋二娃的BLOG)

热门文章

  1. 节奏大师乐谱破解 续
  2. AHP计算权重.mat
  3. 浙江计算机三级在线试题及答案,计算机三级试题及答案
  4. c#中使用BackgroundWorker
  5. 瑞星搜狐畅游合作 “云安全”首次嵌入网游客户端
  6. Protel99SE推荐使用英文版
  7. java毕业设计基于javaweb+mysql数据库实现的在线学习网站|在线课堂含论文+开题报告
  8. CImageList 透明贴图解决方案
  9. LiquidCrystal_I2C 显示不正常 只显示第一个首字符!
  10. matlab计算潮流,matlab潮流计算