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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JS JSP ASP .NET J2AM API接口和返回的版本 目前所有版本的JS JSP ASP .NET J2AM 都是提供源代码的,对于一些脚本语言来说,直接解压缩之后就可以使用了,不需要什么安装步骤。另外一些需要编译的语言,则提供了编译用的 shell 文件(Linux/Unix 下使用)和 bat 文件(Windows 下使用),或者直接提供编译好的二进制库文件。 不过为了让读者能够更清楚如何安装,我们还是对每种语言的安装都做详细的讲解,你可以在安装列表里找到你感兴趣的语言的安装方法。 示例 如果你已经把 JS JSP ASP .NET J2AM 安装好了,那么接下来就让我们开始第一个小程序吧。按照惯例,第一个演示程序几乎总是 HelloWorld,我们也不想打破这个惯例,不过对于 PHPRPC 来说,有服务器端就要有客户端,否则我们就没有什么好演示的啦,所以我们的第一个演示程序实际上是两个,一个是服务器端,另一个是客户端。我们都先用 PHP 语言来写好了。 服务器端 view plaincopy to clipboardprint? <?php include ("php/phprpc_server.php"); function HelloWorld() { return 'Hello World!'; } $server = new PHPRPC_Server(); $server->add('HelloWorld'); $server->start(); ?> 客户端 view plaincopy to clipboardprint? <?php include ("php/phprpc_client.php"); $client = new PHPRPC_Client('http://127.0.0.1/server.php'); echo $client->HelloWorld(); ?> 对于服务器端程序,我们应该将它命名为 server.php(这是因为客户端调用时用的是这个名字,而不是 PHPRPC 的什么规定),然后把它放在本地 Web 服务器的根目录下,并保证服务器可以正常运行 PHP 程序,之后在浏览器或命令行下运行客户端程序,你就可以看到结果了。 这两个程序几乎简单到无需解释的地步,所以如果你已经明白它们的意思,那么就可以直接跳过下面的解释,继续看后面的例子。 服务器端第 1 句是将 它的服务器端程序包含到你的程序里,之后的 2 - 4 句是定义一个远程调用的函数,你会发现它与本地函数没有任何区别。第 5 句是创建服务器端对象,第 6 句是添加要发布的方法,这里添加的就是刚刚定义的 HelloWorld 函数,在 PHP 中,添加的发布方法是函数名的字符串表示,在其它语言中可能略有不同。第 7 句是启动服务。 客户端就更简单了,第 1 句是将 它的客户端程序包含到你的程序里。第 2 句是创建客户端对象,其中的参数就是服务器端的地址。第 3 句是对远程方法(函数)的调用,之后通过 echo 将它显示出来。如果顺利的话,执行后你就会看到输出的 Hello World!。 上面的例子是发布的是函数,下面我们来看一下类中的静态方法如何发布: view plaincopy to clipboardprint? <?php include ("php/phprpc_server.php"); class Hello { static function HelloWorld() { return 'Hello World!'; } } $server = new PHPRPC_Server(); $server->add('HelloWorld', 'Hello'); $server->start(); ?> 这个服务器端只要它的名字与发布的地址与上面那个发布函数的例子一样的话,上面的那个客户端就可以得到同样的结果,也就是说,在客户端看来是没有任何区别的。 它并不是只可以在 PHP 中使用,它同样支持其它语言的服务器和客户端,而且还可以无差别的相互调用。 现在我们来看一下如何在 Java 中调用这个 PHP 的服务器方法: view plaincopy to clipboardprint? import org.phprpc.*; interface IHello { public String helloWorld(); } public class HelloWorld

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值