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接口版本控制的问题相关推荐

  1. java接口版本控制_为什么要在Java中控制类和接口的可见性

    java接口版本控制 维护是软件开发的重要方面之一,并且经验证明,保持较低组件可视性的软件比暴露更多组件的软件更易于维护. 您不会在一开始就意识到它,但是在重新设计应用程序时会严重错过它. 由于保持向 ...

  2. php版本控制在线推送升级,ThinkPHP5:app版本控制,版本升级接口开发

    目录 0x00 app版本控制解决方案 0x01 API接口文档编写 0x02 APP 调试 0x03APP版本表结构的设计 0x04 APP 版本升级接口开发(一) 0x05 APP 版本升级接口开 ...

  3. 腾讯微博API时间线相关接口返回的微博信息中head值使用问题

    腾讯微博API时间线相关接口返回的微博信息中head值表示作者头像url,这个链接直接访问并不能使用,需要再附加一个参数指定图片的大小(100.50),比如:[head]/100.

  4. Golang面向API编程-interface(接口)

    Golang面向API编程-interface(接口) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Golang并不是一种典型的面向对象编程(Object Oriented Pr ...

  5. 淘宝打标API,旺旺打标签接口文档

    应用场景: 1.解决新品无法搜到到问题. 2.提前把大批量旺旺号打上淘宝打标API,可以入池首页及手淘搜索. 常见问题: 1.无基础商品不可操作. 3.动态全飙绿,90天扣过12分,请勿操作. 打标演 ...

  6. 【MT4 Client API 服务器直连接口】接口介绍

    Client API 主要分为两部分: 报价 API 交易 API 这个类别分得有点大,实际应再细分一点,应该是这几类: 账户信息 API(名称.账号.杠杠.净值.余额等) 订单信息 API(持仓订单 ...

  7. 浮云API 随机二次元图片接口开放文档 1w+数据

    最后更新 2022-08-28 AM07:25:58 1w+数据 接口文档: https://api.ooomx.com/doc/acg.html 接口地址(直接输出图片): https://api. ...

  8. 整理一份API接口,包括音乐API,图片API,聚合API等等

    音乐: MessAPI(支持网易QQ酷狗酷我咪咕百度) QQ音乐API 网易云音乐 NodeJS 版 API 自己动手开发QQ音乐api调用教程 自己动手开发网易云音乐api调用教程 图片: Unsp ...

  9. RABBIT API (随机ACG图片接口推荐)

    RABBIT API (随机ACG图片接口推荐) 接口地址: https://api.kafuuchino.com.cn 功能说明: 访问网站 https://kafuuchino.com.cn 创建 ...

  10. 京东价格api,京东商品详情接口,京东api,京东优惠券接口,京东到手价api接口,京东app详情接口,接口代码对接实现价格监控接口,品牌维权接口,行业分析api接口代码分享

    一.京东价格api,京东商品详情接口,京东api,京东优惠券接口,京东到手价api接口,接口代码对接实现价格监控,行业分析接口代码如下: 点击获取测试key和secret 1.接口请求参数如下: 请求 ...

最新文章

  1. mybatis 如何判断重复插入_MyBatis常见面试题3:数据库插入重复如何处理
  2. RocketMQ 消息丢失场景及解决办法
  3. spring boot新建非web项目(无需依赖)
  4. java获取oracle表空间_Oracle 表空间使用情况查询与修改
  5. 小朋友学C++(1)
  6. LeetCode 790. 多米诺和托米诺平铺(动态规划)
  7. 【转】使用手势对UIImageView进行缩放、旋转和移动
  8. 基于JAVA+SpringBoot+MYSQL的医院预约挂号平台
  9. systemtap gui
  10. python oj题目_Python OJ 从入门到入门基础练习 10 题
  11. windowsf进程管理器中进程解释
  12. mellanox 网卡驱动,Mellanox网卡OFED驱动安装
  13. 安卓开发——MaterialDesign实战
  14. 【IOI2018】【luoguP4898】 seats 排座位 (线段树)
  15. 神经网络系列之四 -- 线性回归方法与原理
  16. genymotion-安卓模拟器-修改IMEI
  17. Android仿京东、天猫商品详情页
  18. 【云贝学院】揭秘TDSQL分布式实例扩容的逻辑流程
  19. 微信群营销方式微信群建群营销案例
  20. 希望越大失望越大?iPhone 4S详情解析

热门文章

  1. 【答题卡识别】基于matlab GUI hough变换答题卡成绩统计(带面板)【含Matlab源码 1828期】
  2. 【TSP】基于matlab GUI模拟退火+蚁群+遗传算法求解旅行商问题【含Matlab源码 1611期】
  3. 【TWVRP】基于matlab遗传和模拟退火算法求解带时间窗的取送货问题【含Matlab源码 1139期】
  4. bin mysql u root_MySQL安装后续步骤(修改root密码)
  5. poi 获取删除线_Houdini 删除相机看不到的点背面的点或面
  6. 自动化生产线认知_什么是认知自动化?
  7. 内置函数的数据聚合NumpyPandas
  8. Sublime Text3:解决win10输入法输入框不跟随问题
  9. c语言累加和校验_累加和校验算法(CheckSum算法)
  10. html加载js文件失败,引入js失败的可能原因