java后端 解决app接口版本管理问题
当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接口版本管理问题相关推荐
- html小Demo: js调用java后端提供的接口
文章目录 html小Demo: js调用java后端提供的接口 html常用的一些标签(初级版)以及对html的一些理解的笔记 head常用标签 body常用标签 JavaScript Java sp ...
- java后端解决重复提交问题
一.为什么会出现重复提交? 主要是由于网络的延迟问题以及页面刷新的操作. 二.表单的重复提交会导致的问题? 主要能够造成很多脏数据. 三.解决的办法: 3.1 前端解决办法:通过前端的方法将提交按钮变 ...
- java后端请求第三方接口并处理HttpEntity类转换成实体类对象
最近在写使用java后端去请求第三方接口的代码,给大家分享关于HttpEntity类的处理方式,而处理请求是需要根据第三方的要求来处理的,所以这里着重展示HttpEntity的处理. 在开始代 ...
- java后端解决跨域问题
首先我门要知道什么是跨域: 跨域是指 不同域名之间相互访问.跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制. 也就是如果在A网站中 ...
- Java后端返回通用接口设计
我印象中,通用返回接口设计是有两种方式,第一种是自定义返回数据的通用类,另一种是springboot中实现ResponseBodyAdvice接口,实现返回数据格式的统一,如我说的有错,请大佬指出.本 ...
- Java后端解决前后端跨域的3种方法
1.在方法上使用@CrocsOrigin注解 2.在配置类包内添加一个返回值为CorsFilter过滤器的配置类 package com.example.springboot.config;impor ...
- java后端实现集成支付宝APP支付(沙箱环境)
沙箱环境集成支付宝APP支付后端实现 前言 获取支付宝相关信息 整体开发流程 1.获取核心参数 2.将支付宝SDK集成到项目中 3.后台使用支付宝SDK与支付宝进行交互逻辑 1.将支付宝公共信息参数写 ...
- 解决“微信小程序http请求参数为空时,传到java后端变成了undefined”问题
遇到问题: 最近在对接微信小程序和java后端springboot框架的接口,然后发现一个问题,当微信小程序发起http请求时,如果请求参数的值为空,传到java后端时就变成了undefined,这样 ...
- vue+Java后端进行调试时如何解决跨域问题
今天在开发过程中遇到一个问题,拿到了一套vue代码,计划对这套代码的部分样式进行调整,Java后端代码已经写好并且部署到了线上.这时命令行运行vue项目时访问会受限,取不下数据来,遇到了跨域访问失败的 ...
- vue 解决跨域 调试_vue+Java后端进行调试时解决跨域问题的方式
今天在开发过程中遇到一个问题,拿到了一套vue代码,计划对这套代码的部分样式进行调整,Java后端代码已经写好并且部署到了线上.这时命令行运行vue项目时访问会受限,取不下数据来,遇到了跨域访问失败的 ...
最新文章
- .NET : 再谈谈XML中的命名空间问题
- 我国第一台微型计算机诞生于哪一年,2015计算机一级《MSOffice》章节练习题及答案(1)...
- 推荐八款来自极客标签的超棒前端特效[第八期]
- pip国内镜像源速度几十倍于官方及如何设置
- 表达式求值问题 数据结构_【每日一题51】实际问题与一次函数 看图象求表达式 由表达式求值...
- python list tuple 打包 解包_python的打包与解包
- 错误提示:ssh: Could not resolve hostname devsrv: Name or service not known
- [转载]windows 7 IIS 7.5 ASP.Net 文件上传大小限制
- C#实现所有CRC8,CRC16,CRC32校验算法
- 怎么把动图分解成图片?gif怎么拆分成几张?
- 导线电感、走线电感、过孔电感计算公式
- 你每天都在使用的HTTP协议,到底是什么鬼?
- MATLAB读二进制数据文件
- 科技进步计算机开机速度,笔者教你电脑开机慢怎么办
- APIC Timer
- 云呐|固定资产计提折旧怎么算
- 解读:基于图卷积特征的卷积神经网络的股票趋势预测(文末赠书)
- Win10系统打开photoshop提示错误16 如何解决?
- 【论文阅读】Alignment-Robust Cancelable Biometric Scheme for Iris Verification
- 数论概论 第五章 习题解答(下) (宋二娃的BLOG)
热门文章
- 节奏大师乐谱破解 续
- AHP计算权重.mat
- 浙江计算机三级在线试题及答案,计算机三级试题及答案
- c#中使用BackgroundWorker
- 瑞星搜狐畅游合作 “云安全”首次嵌入网游客户端
- Protel99SE推荐使用英文版
- java毕业设计基于javaweb+mysql数据库实现的在线学习网站|在线课堂含论文+开题报告
- CImageList 透明贴图解决方案
- LiquidCrystal_I2C 显示不正常 只显示第一个首字符!
- matlab计算潮流,matlab潮流计算