php api 版本控制,API版本控制的几种思路

### 2018 年 11 月 3 日 发布

我们假设API接口的域名名为`api.tp5.com`,并且以两个版本`v1`和`v2`为例(注意,版本号仅为主版本,小版本应该是直接升级,不应该存在共存情况,所以`v1.1`或者`v2.0`这种版本号不应该设计在URL里面),来说明下API版本的不同控制方式,以及应该如何进行开发的规划。

## 通过子域名(或子目录)

第一个办法,是直接使用两个模块(或者应用)来实现,对于架构改变比较大的API版本(尤其是不同版本之间基本没法共用、更改框架甚至采用不同的语言实现)通常会这样选择。

目录结构如下:

```

api

├─application

│ ├─v1

│ │ ├─controller

│ │ ├─model

│ │ ├─config

│ │ └─ ...

│ ├─v2

│ │ ├─controller

│ │ ├─model

│ │ ├─config

│ │ └─ ...

│ ...

```

请求方式

```

GET https://api.tp5.com/v1/user/1

GET https://api.tp5.com/v2/user/1

```

当然,你也可以通过子域名绑定模块实现下面的方式访问

```

GET https://v1.api.tp5.com/user/1

GET https://v2.api.tp5.com/user/1

```

## 通过请求参数

对于刚开始没有做好版本规划,后期迭代维护过程中增加了新的版本,考虑到架构的改造成本,可能会考虑下面的方式:

```

GET https://api.tp5.com/user/1

GET https://api.tp5.com/user/1?version=v2

```

由于缺乏很好的路径和类库目录规范,如果频繁更新版本的话,建议把版本的架构设计升级成后面的两种方式。

## 通过路由

可能大多数接口在设计的时候已经考虑到了版本控制的问题,那么通常会选择在URL地址中增加版本标识参数,这种方式便于调试。

对于API应用来说,更建议采用**单模块设计+多级控制器**,目录结构如下:

```

api

├─application

│ ├─controller

│ │ ├─v1

│ │ ├─v2

│ │ └─ ...

│ ├─model

│ ...

```

路由规则定义如下:

```

Route::get(':version/user/:id',':version.User/read');

```

```

GET https://api.tp5.com/v1/user/1

GET https://api.tp5.com/v2/user/1

```

由于使用了多级控制器,需要注意控制器的命名空间。

通过命令行可以快速的创建控制器文件:

```

php think make:controller v1/User

```

## 通过头信息

最新的规范趋向于通过头信息来定义版本,优势在于从历史版本迭代更新的时候不需要改变URL地址,改变请求头信息即可,主要分为两种。

第一种是使用自定义请求头例如`api-version`控制版本(同理你还可以用其它头信息控制其它)

```

GET https://api.tp5.com/user/1

api-version:v2

```

头信息的方式,路由规则的定义略微做下调整即可:

```

use think\facade\Request;

use think\facade\Route;

$version = Request::header('api-version') ? : 'v1';

Route::get('user/:id', $version . '.User/read');

```

也有很多采用了`Accept`头信息来处理(好处是可以设置接口输出格式),通常的规范是

```

GET https://api.tp5.com/user/1

Accept: application/vnd.tp5.v2+json

```

## 总结

对于API接口开发,尽量事先做好版本控制规划,确保你的应用能兼容新老版本的访问。

  • 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、付费专栏及课程。

余额充值