php api 版本控制,PHP-API接口版本控制的问题
api 接口版本控制找了一下资料总共有几种类型
不设定版本模式意味着每个API只提供一个版本,如果要修改本API, 所有的用户都必须使用最新的API,任何API的修改都会影响到所有的用户。
API自带版本模式同一个名称的API可以建立多个版本,API调用方根据自己的需求选择使用对应的API版本。新版本与老版本共存,意味着老版本用户不会受新版本更新的影响。
兼容性版本模式每个API只有一个版本,API需要兼容以前老版本API的功能。所有版本用户都调用同一个API,通过内在代码保证兼容性。
具体一些内容可以看一下介绍https://juejin.im/post/5977f8ba5188255b9a6ad820
解决版本控制有5种类型
1.url增加版本编号
http://localhost/index.php/home/v1/index/test
2.url增加版本信息
http://localhost/index.php/home/index/test/v1
3.新增接口
http://localhost/index.php/home/index/newTest
4.客户端在做请求的时候在HTTP HEAD里面中添加API-VERSION字段,标识出请求的是哪个接口:
-H "API-VERSION: v1"
-H "API-VERSION: v2"
5.不同版本使用不同的域名,这样:
v1.api.xxx.com
v2.api.xxx.com
以下代码是基于TP3.2.3修改的:
修改这个代码做法是:url可以全部统一修改为最新版本,如果最新版本不存在会自动查找低版本的接口
在网上查找的资料都是可以用那几种类型,没有具体事例,下面是我自己想法修改出来的代码。
修改的tp入口文件名 app.class.php
/**
* 执行应用程序
* @access public
* @return void
*/
static public function exec() {
if(!preg_match('/^[A-Za-z](\/|\w)*$/',CONTROLLER_NAME)){ // 安全检测
$module = false;
}elseif(C('ACTION_BIND_CLASS')){
// 操作绑定到类:模块\Controller\控制器\操作
$layer = C('DEFAULT_C_LAYER');
if(is_dir(MODULE_PATH.$layer.'/'.CONTROLLER_NAME)){
$namespace = MODULE_NAME.'\\'.$layer.'\\'.CONTROLLER_NAME.'\\';
}else{
// 空控制器
$namespace = MODULE_NAME.'\\'.$layer.'\\_empty\\';
}
$actionName = strtolower(ACTION_NAME);
if(class_exists($namespace.$actionName)){
$class = $namespace.$actionName;
}elseif(class_exists($namespace.'_empty')){
// 空操作
$class = $namespace.'_empty';
}else{
E(L('_ERROR_ACTION_').':'.ACTION_NAME);
}
$module = new $class;
// 操作绑定到类后 固定执行run入口
$action = 'run';
}else{
//创建控制器实例
/****以下是修改的代码******/
$p = CONTROLLER_NAME;
$c = explode('/', $p);
$mod = substr($c[0], 0,1);
if ($mod!='V') {
$action = $c[1];
$p = 'V1/'.substr($p, 0,stripos($p,'/'));
}
if (!controller($p)) {
$p = explode('/', $p);
$n = substr($p[0], 1);
$b = 'V'.$n;
while (!controller($b.'/'.$p[1])) {
$n = --$n;
$b = 'V'. $n;
if ($n==0) {
break;
}
if (controller($b.'/'.$p[1])) {
$module = controller($b.'/'.$p[1]);
break;
}
}
}else{
// $module = controller(CONTROLLER_NAME,CONTROLLER_PATH);
$module = controller($p);
$p = explode('/', $p);
$n = substr($p[0], 1);
}
}
if(!$module) {
if('4e5e5d7364f443e28fbf0d3ae744a59a' == CONTROLLER_NAME) {
header("Content-type:image/png");
exit(base64_decode(App::logo()));
}
// 是否定义Empty控制器
$module = A('Empty');
if(!$module){
E(L('_CONTROLLER_NOT_EXIST_').':'.CONTROLLER_NAME);
}
}
// 获取当前操作名 支持动态路由
if(!isset($action)){
$action = ACTION_NAME.C('ACTION_SUFFIX');
}
try{
self::invokeAction($module,$action);
} catch (\ReflectionException $e) {
// 方法调用发生异常后 引导到__call方法处理
self::isAction($n,$p,$action);
$method = new \ReflectionMethod($module,'__call');
$method->invokeArgs($module,array($action,''));
}
return ;
}
//增加判断该方法不存在时 查找下一个控制
public static function isAction($n,$p,$action){
if ($n==1) {
$module = controller($b.'/'.$p[1]);
self::isController($module);
try{
self::invokeAction($module,$action);
} catch (\ReflectionException $e) {
// 方法调用发生异常后 引导到__call方法处理
$method = new \ReflectionMethod($module,'__call');
$method->invokeArgs($module,array($action,''));
}
}
$b = 'V'.--$n;
if (controller($b.'/'.$p[1])) {
$module = controller($b.'/'.$p[1]);
try{
self::invokeAction($module,$action);
} catch (\ReflectionException $e) {
// 方法调用发生异常后 引导到__call方法处理
self::isAction($n,$p,$action);
$method = new \ReflectionMethod($module,'__call');
$method->invokeArgs($module,array($action,''));
}
}
self::isAction($n,$p,$action);
}
php api 版本控制,PHP-API接口版本控制的问题相关推荐
- java接口版本控制_为什么要在Java中控制类和接口的可见性
java接口版本控制 维护是软件开发的重要方面之一,并且经验证明,保持较低组件可视性的软件比暴露更多组件的软件更易于维护. 您不会在一开始就意识到它,但是在重新设计应用程序时会严重错过它. 由于保持向 ...
- php版本控制在线推送升级,ThinkPHP5:app版本控制,版本升级接口开发
目录 0x00 app版本控制解决方案 0x01 API接口文档编写 0x02 APP 调试 0x03APP版本表结构的设计 0x04 APP 版本升级接口开发(一) 0x05 APP 版本升级接口开 ...
- 腾讯微博API时间线相关接口返回的微博信息中head值使用问题
腾讯微博API时间线相关接口返回的微博信息中head值表示作者头像url,这个链接直接访问并不能使用,需要再附加一个参数指定图片的大小(100.50),比如:[head]/100.
- Golang面向API编程-interface(接口)
Golang面向API编程-interface(接口) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Golang并不是一种典型的面向对象编程(Object Oriented Pr ...
- 淘宝打标API,旺旺打标签接口文档
应用场景: 1.解决新品无法搜到到问题. 2.提前把大批量旺旺号打上淘宝打标API,可以入池首页及手淘搜索. 常见问题: 1.无基础商品不可操作. 3.动态全飙绿,90天扣过12分,请勿操作. 打标演 ...
- 【MT4 Client API 服务器直连接口】接口介绍
Client API 主要分为两部分: 报价 API 交易 API 这个类别分得有点大,实际应再细分一点,应该是这几类: 账户信息 API(名称.账号.杠杠.净值.余额等) 订单信息 API(持仓订单 ...
- 浮云API 随机二次元图片接口开放文档 1w+数据
最后更新 2022-08-28 AM07:25:58 1w+数据 接口文档: https://api.ooomx.com/doc/acg.html 接口地址(直接输出图片): https://api. ...
- 整理一份API接口,包括音乐API,图片API,聚合API等等
音乐: MessAPI(支持网易QQ酷狗酷我咪咕百度) QQ音乐API 网易云音乐 NodeJS 版 API 自己动手开发QQ音乐api调用教程 自己动手开发网易云音乐api调用教程 图片: Unsp ...
- RABBIT API (随机ACG图片接口推荐)
RABBIT API (随机ACG图片接口推荐) 接口地址: https://api.kafuuchino.com.cn 功能说明: 访问网站 https://kafuuchino.com.cn 创建 ...
- 京东价格api,京东商品详情接口,京东api,京东优惠券接口,京东到手价api接口,京东app详情接口,接口代码对接实现价格监控接口,品牌维权接口,行业分析api接口代码分享
一.京东价格api,京东商品详情接口,京东api,京东优惠券接口,京东到手价api接口,接口代码对接实现价格监控,行业分析接口代码如下: 点击获取测试key和secret 1.接口请求参数如下: 请求 ...
最新文章
- mybatis 如何判断重复插入_MyBatis常见面试题3:数据库插入重复如何处理
- RocketMQ 消息丢失场景及解决办法
- spring boot新建非web项目(无需依赖)
- java获取oracle表空间_Oracle 表空间使用情况查询与修改
- 小朋友学C++(1)
- LeetCode 790. 多米诺和托米诺平铺(动态规划)
- 【转】使用手势对UIImageView进行缩放、旋转和移动
- 基于JAVA+SpringBoot+MYSQL的医院预约挂号平台
- systemtap gui
- python oj题目_Python OJ 从入门到入门基础练习 10 题
- windowsf进程管理器中进程解释
- mellanox 网卡驱动,Mellanox网卡OFED驱动安装
- 安卓开发——MaterialDesign实战
- 【IOI2018】【luoguP4898】 seats 排座位 (线段树)
- 神经网络系列之四 -- 线性回归方法与原理
- genymotion-安卓模拟器-修改IMEI
- Android仿京东、天猫商品详情页
- 【云贝学院】揭秘TDSQL分布式实例扩容的逻辑流程
- 微信群营销方式微信群建群营销案例
- 希望越大失望越大?iPhone 4S详情解析
热门文章
- 【答题卡识别】基于matlab GUI hough变换答题卡成绩统计(带面板)【含Matlab源码 1828期】
- 【TSP】基于matlab GUI模拟退火+蚁群+遗传算法求解旅行商问题【含Matlab源码 1611期】
- 【TWVRP】基于matlab遗传和模拟退火算法求解带时间窗的取送货问题【含Matlab源码 1139期】
- bin mysql u root_MySQL安装后续步骤(修改root密码)
- poi 获取删除线_Houdini 删除相机看不到的点背面的点或面
- 自动化生产线认知_什么是认知自动化?
- 内置函数的数据聚合NumpyPandas
- Sublime Text3:解决win10输入法输入框不跟随问题
- c语言累加和校验_累加和校验算法(CheckSum算法)
- html加载js文件失败,引入js失败的可能原因