APP API如何维护多个版本的一些想法?
1、第一种形式:api版本号放在url路径中
https://api.example.com/v1/user/ID
https://api.example.com/v2/user/ID
https://api.example.com/v3/user/ID
2、第二种形式:api版本号放在url参数中
https://api.example.com/user/ID?version=v1&..
https://api.example.com/user/ID?version=v2&..
https://api.example.com/user/ID?version=v3&..
这种做起来比较简单也容易理解,但是在你的每个接口逻辑里面都需要写判断版本的代码。比如:
if(version=='v1'){
...
}else if(version=='v2'){
...
}
这样的代码看起来感觉很不舒服。而且会维护一大堆的if-else,以后会越来越长。
3、第三种形式:api版本号放在请求的header中
客户端在做请求的时候,在HTTP HEAD里面中添加API-VERSION字段,标识出请求的是哪个接口:
-H "API-VERSION: v1"
-H "API-VERSION: v2"
这个需要统一做的事情稍微有点多,但之后的接口逻辑会比较好些。在入口的地方获取接口版本,然后把请求分发到对应版本的接口处理器上。
4、第四种形式:api版本号放在二级域名中
不同版本使用不同的域名,例如:
v1.api.xxx.com
v2.api.xxx.com
域名的方式可以采用下面的两种方式:
1、不同版本的api部署成不同的应用(甚至可以部署到不同的服务器上),彼此间独立,其好处是部署的过程不会影响其他版本api的使用,并且可以减轻单台服务器的负担。
2、部署在一个应用上面,但是和第三种一样,在接口入口处分发到不同版本的接口处理器上进行处理。好处是不同版本间能够直接复用相同的功能。
总结一下:
个人比较倾向于第一种(xxx.com/v1/、xxx.com/v2/):
在整个产品的生命周期中接口的数目和功能可能会不停的增加,但对于某个接口而言,不会频繁的变动(修改接口的输入输出约定),而增加接口对于老的接口是没有影响的,也就不会到必须升级接口的地步(你的老app只是在用原来就存在的老接口而已,新增加的接口对它没有影响)。
如果你的接口变化已经到了今天v1、明天v2、后天v3的地步,那么得考虑你们一开始对产品的需求是否足够准确了(估计需要维护的接口文档也会让人头疼)。
不同版本接口相互独立在某种程度上限制了你,让你不会随随便便就v1、v2、v3。(当你每天都要用一个新域名的时候你自己一定会不自然的反思是不是变换太频繁了)。
接口版本信息能够直接在url里面体现,清晰易懂,也比较容易做接口调试(没错,给我一个Chrome就够了)。
不同的版本的api应用(或者接口处理器)之间彼此独立,这符合软件工程的低耦合原则。
没有很优雅的设计,只能自己考虑的长远写,接口的代码写的可扩展性高一些。App跟网站不一样,即使你发新版了还是有很高几率用户不买账不更新的。所以最好在最初设计接口的时候就想的长远些,API的URL不能随便动,
所以设计核心业务的API只能考虑的比较清楚了,有些东西刚开始不做但是近期几个版本要做的话就预先留好入口,代码写的可扩展性高一些方便以后兼容,数据库中也可先预留好字段。
对版本接口维护,个人认为是灾难性的。不同版本的业务逻辑,需要操作最新版本的数据结构,同时还要维护各版本的文档,各版本的自动化测试或者人工测试。
所以个人认为比较好的做法是,在开始设计的时候,查询类的接口,应尽可能使用被动式提供数据的无状态接口,格式应竟可能使用对象(不使用二维的集合),这样的接口对于扩展字段非常的方便,也很容易做到向下兼容.
操作类的接口,尽可能地将资源分离,比如修改用户信息,跟修改用户头像信息或者修改用户职位信息,这样的接口,尽可能使用独立的资源。
对于实在没有办法需要全面升级接口的。
如果可能,保持原有的业务,原有的接口运转正常。
然后构建一套全新的隔离的接口。
最后做下版本使用监控。当观察到所有用户都使用新版本的客户端的时候,并保持一段时间的时候。放弃对老版本的维护,继而下掉老版本的资源。当然,万不得已的时候,还可以用强制更新。
APP API如何维护多个版本的一些想法?的更多相关文章
- zabbix api 设置维护模式
通过zabbix提供的api进行维护模式的设置 #!/usr/bin/env python # -*-coding:utf-8-*- import urllib import urllib2 impo ...
- 初步探究Android App API接口测试--实战
一.Android App API接口测试 1.如何学好Android App API接口测试 postman可以用来实现API接口自动化测试,但是也有弊端,无法实现接口测试数据的参数化,为了达到接口 ...
- [经验]微信开放平台,一个APP secret可以绑定一个APP,然后再绑定一个ipad 版本APP
微信开放平台,一个APP secret可以绑定一个APP,然后再绑定一个ipad 版本APP
- android 6 (API 23) 及更高版本 面向 NDK 开发者的 Android 变更
Android N 已经出来,有了好大的变化,对于我们开发者来说,最大的影响莫过于**NDK**相关东西. 以下是在中国谷歌开发者社区看到的.里面有好多的变化,欢迎大家来讨论. 发布人:开发顾问 Dm ...
- 让SpringMVC Restful API优雅地支持多版本
好久没有更新博客,难得有空,记录一下今天写的一个小工具,供有需要的朋友参考. 在移动APP开发中,多版本接口同时存在的情况经常发生,通常接口支持多版本,有以下两种方式: 1.通过不同路径区分不同版本 ...
- Android APP 读取 AndroidManifest.xml 中的版本信息详解
APP都会涉及到版本的问题,Android APP的版本信息保存在AndroidManifest.xml文件的顶部.如下图: 有2个属性表示,“android:versionCode”和“androi ...
- 几种移动app API调用认证方案浅析
最近做的金融项目,app调用的接口需要做一个身份认证,所以找了下目前API services验证的几种方式.之前翻译的一篇文章--[译]移动API安全终极指南中,主要提出了API服务调用验证的问题,通 ...
- ArcGIS API for JavaScript 4.4 版本加载谷歌地图
ArcGIS API for JavaScript 4.X 版本升级后,API发生了很大的变化. 其中就支持了WebEarth展示,主要是通过 esri/views/SceneView 实现的. 在新 ...
- VS 提示:请考虑使用 app.config 将程序集“XXX”从版本“XX”重新映射到版本“XX”,以解决冲突并消除警告。
具体提示如下: 请考虑使用 app.config 将程序集"System.Web.Http.WebHost, Culture=neutral, PublicKeyToken=31bf3856 ...
随机推荐
- openjudge ROADS
726:ROADS 总时间限制: 1000ms 内存限制: 65536kB 描述 N cities named with numbers 1 ... N are connected with one- ...
- openLDAP
错误提示: D:\OpenLDAP>slapd -d 256 515a48ae OpenLDAP 2.4.34 Standalone LDAP Server (slapd)515a48af co ...
- 使用Debussy+ModelSim快速查看前仿真波形
sim.do文件 quit -sim set PATH1 D:/Program/modelsim/vivado_lib set PATH2 D:/Program/Vivado/Vivado/2014. ...
- flash项目优化总结
swc中的类如果没有在项目中没有被申明,在编译时就不会被编译进swf中,这样一些swc中的类和资源类如果不用了,只要不被声明就不会占用swf大小了.
- 如何在spark中读写cassandra数据 ---- 分布式计算框架spark学习之六
由于预处理的数据都存储在cassandra里面,所以想要用spark进行数据分析的话,需要读取cassandra数据,并把分析结果也一并存回到cassandra:因此需要研究一下spark如何读写ca ...
- HDU 1394Minimum Inversion Number 数状数组 逆序对数量和
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- [PHP]Yaf + composer 引起大幅性能下降
composer.json 文件可以用命令 composer init 创建,命令是交互式的. 也可以直接编辑一个 json 文件,如下: repositories 中 url 使用中国全量镜像地址. ...
- ubuntu下配置lamp环境
安装MySQL sudo apt-get install mysql-server mysql-client 安装php模块 Sudo apt-get install php5 安装Apache2 S ...
- 360极速浏览器UA怪异以及如何用js判断360浏览器
本文最后一次更新于7个月前,文章内容可能略有出入.若发现文章中有错误之处,可以留言评论告诉作者. 1.360极速浏览器UA因域名不同而异 今天在写一个判断浏览器.浏览器版本.操作系统.操作系统版本.浏 ...
- GDI+技术
GDI+是GDI的后继者,它是一种构成 Windows XP 操作系统的子系统的应用程序编程接口. 一般来说有3种基本类型的绘图界面,分别为Windows 窗体上的控件.要发送给打印机的页面和内存中的 ...