遇到的情况
本文针对移动互联网客户端需要兼容旧版的情况,强制升级到最新版本的 app 不在讨论之列。
在 bugtags.com 项目中,我们的版本遵循下面规范。
1.0.1
大功能.小更新.bug 修正
我们的版本列表如下:
1.0、1.1、1.2、1.3、1.4
2.0、2.1、2.2、2.3
3.0、3.1
…
5.0
这样一个版本结构,所有版本都可以用,跨度最大时,1.0 用户要跟 5.0 用户并存。
以 /api/user/info 接口举例,经过这么多版本的迭代,版本 1.0 跟 3.0 的返回数据结构可能已经完全不同了。
对于这样一个系统,如何设计一个完备的版本架构非常重要。
理解其中的困难
移动互联网,有别于传统的 web 开发。其快速迭代、版本升级与传统的 web 开发相比,有如下困难:
- 用户获取困难,留存率低
- 客户端升级成本高,部分用户拒绝升级
- 多个版本服务器端代码量大,急剧拉高维护成本
架构的目的及要求
- 简化版本管理流程,易配置管理
- 缩小服务器端的 php 代码规模
- 尽量不要引入新的要素
微信群里的讨论
请求形式的约定
- 使用域名,如 v1.api.bugtags.com 来区分接口的版本
- 将版本信息放到 url 的 pathinfo 中,如 api.bugtags.com/v1/
- 将版本信息放到请求参数中,如 api.bugtags.com/user/1?_ver=1.0.1
- 将版本信息放到 http header 中,如 API_VER: 1.0.1
版本号用域名是比较不被认同的方案,主要原因是域名管理往往跨部门,增加了沟通成本。
http 头是我个人最赞同的一种方式,可以保持 url 的整洁。
url 参数中携带版本号的方式也很好,但是要注意不要跟业务逻辑的参数名重复。
两种常见的管理代码的方式
git/svn 的 tag 管理方式
优点,随时切换分支成本低,尤其在 git 管理代码时。
缺点,如果多个版本需要修改时,代码合并工作量大。
只有一个分支,在代码中根据版本信息做判断
优点,代码的总体规模小(只有一份代码)
缺点,在需要判断版本的地方会有大量的分支语句
我总结的解决办法
最后的解决办法充分利用了 php 的 autoload 加载机制和命名空间。
- 假设 base 是所有业务的基础,是第一个版本,也是生命周期最长的版本。
- v10 对版本 1.x.x 提供服务,最大限度消除业务点上的版本逻辑判断,但是不绝对拒绝。
- v20/v30 基于 v10 版本开发
- v40 版本基于 v30 版本开发
举例说明
v10 提供 a,b,c 三个接口
v20 提供 a1,b,c 三个接口, a1 是 a 的修改
v30 提供 a,b1,c 三个接口, b1 是 b 的修改
用下面三段代码来具体描述
相关推荐
《ASP.NET Web API设计》依托ASP.NET Web API阐述API设计与开发的通用技术,是一本全面介绍如何构建真实可演化API的实践指南。本书共分三部分。第一部分介绍Web/HTTP和API开发的基础知识,介绍ASP.NET Web API,为...
6.3.2 JS API支付接口 132 6.3.3 Native(原生)支付接口 137 6.3.4 通知接口 140 6.3.5 收货地址共享接口 147 6.3.6 用户维权系统接口 149 第7章 生活类应用开发 151 7.1 天气预报 151 7.1.1 SmartWeatherAPI...
内容含DevSecOps参考设计指南、软件安全构建成熟...js,php,防SQL注入)、华为Java语言编程规范、软件安全设计原则、企业软件安全开发实践、Microsoft SDL实施、S-SDLC企业最佳安全实践、API安全、精简版SDL落地实践等等
微信公众平台开发最佳实践的源代码,没有加密。微信公众平台开发最佳实践讲的很详细,图文并茂。 其目录如下: 前 言 第1章 微信公众平台介绍 1 1.1 微信及其两大平台 1 1.2 微信公众平台 2 1.2.1 功能 2 1.2.2...
PHP异步开发Swoole框架教程
两个资源:书籍和作者图书和作者API的CRUD操作REST API(路由,控制器,口才,关系) 数据库迁移和数据库种子输入验证正确的404页API版本控制Dingo 速率限制/节流变形金刚/序列化器和元信息分形测试驱动开发PHPUnit...
微信公众平台应用开发实践教程.zip 1.php+html5+xml 第2章 微信公众平台API 第3章 第一个微信应用 第4章 带自定义菜单的微信应用 第5章 实战案例1 每日十幅图 第6章 实战案例2 人脸识别 第7章 实战案例3 游戏命运...
本毕设旨在开发一个基于{主机域名}的PHP+AJAX的...总之,本毕设旨在开发一个基于{主机域名} PHP+AJAX的whois查询程序,通过对技术工具的深入学习和实践应用,提高自己的编程能力和综合素质。于{主机域名} PHP+AJAX的who
该文档是一篇关于微信PHP开发的“获取用户基本信息”的PHP代码,绝对是本人实践开发代码,可以运行 header("Content-type: text/html; charset=utf-8"); //获取access_token开始 $appid = ""; $appsecret = ""; ...
社区文档是 PHP和 Laravel开发相关知识文档,覆盖话题包括安全、API开发、设计模式、PHP开发最佳实践等现代化 PHP开发知识和开发技巧。
Lin-CMS 是林间有风团队经过大量项目实践所提炼出的一套内容管理系统框架。 Lin-CMS 可以有效的帮助开发者提高 CMS 的开发效率。 Lin CMS 特点: Lin CMS 的构筑思想是有其自身特点的。下面我们阐述一些 Lin 的主要...
有一个的旧版本,它记录了我过去的一些代码实践,并且也很有价值。目录用于PHP的Nginx API 用于PHP的Nginx非阻塞API Nginx常数版权和许可 官方php有什么不同全局变量在每个请求中都是不安全的类的静态变量在每个...
ThinkPHP是一个快速、简单的面向对象的轻量级PHP开发框架,遵循Apache2开源协议发布,并且永久免费使用,是为了简化企业级应用开发和敏捷WEB应用开发而诞生的。借鉴了国外很多优秀的框架和模式,使用面向对象的开发...
Web 服务概述: 介绍什么是 Web 服务以及它们在现代 Web 开发中的作用和应用场景。 PHP 简介: 介绍 PHP 编程语言的基础知识和语法,以及如何在 PHP 中编写 Web 服务。 RESTful API 设计: 深入探讨如何设计和实现...
包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。 包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python...
MailChimp API v2.0 PHP 示例应用程序 使用我们的示例应用。 该应用程序的目的是演示在公共环境中设置包装器,对我们的 API 进行一些基本的 API 调用,并使用/显示结果。 这不一定会显示每种可用方法的示例或每种...
PHP-CRUD-ADMIN 单个文件PHP脚本中MySQL,PostgreSQL或SQL Server的数据库管理界面。要求PHP 7.0或更高版本,已启用用于MySQL,PgSQL或SqlSrv的PDO驱动程序安装这是一个文件应用程序! 在某个地方上传“ admin.php ...
api样板具有最佳设计实践和学习知识的流明API的实现。 (DDD,CQRS,ES,Rest和GraphQL)去做一定有 升级到7.4稳定版 休息路线示例 DTO对象的设置系统 用于CQRS的Symfony消息总线 设置OpenApi解析方法 为资源设置...
Laracasts包含1500多个视频教程,涉及各种主题,包括Laravel,现代PHP,单元测试和JavaScript。 深入我们全面的视频库,提高您的技能。 Laravel赞助商 我们要感谢以下赞助Laravel开发的赞助商。 如果您有兴趣成为...