后端接口版本一多,管理好像特别麻烦
比如请求地址如下:/v1/user/login, /v2/user/login
现在的是方案是:
<?php
class user...
class v1_user extends user...
if (!class_exists($vClass)) $cn = 'base';
else $cn =& $vClass;
$result = call_user_func(array($cn, $method));
echo do($result);
1
huigeer 2015-01-12 14:46:11 +08:00
你们这版本迭代这这么弄的么? 好蛋疼,
|
2
cevincheung OP @huigeer
求优化方案- -# |
3
kqz901002 2015-01-12 14:55:16 +08:00
@cevincheung git svn 继承
|
4
cevincheung OP @kqz901002
访问的URL不变。变的只是版本啊…… 现在是rewrite到index.php 然后获取版本,取class名字,如果没有定义指定版本的class就调用base版。 你意思是每个版本都是独立目录? |
5
learnshare 2015-01-12 15:11:07 +08:00
用 url 区分版本真的好么?不应该是接口自己升级,尽量不影响客户端么
|
6
cevincheung OP @learnshare
现在是没影响啊。旧的版本没人动的。新版本发布后只是在controller目录里增加一个vn的目录而已。旧的被废弃的接口在入口就直接ban掉请求了。 |
7
kqz901002 2015-01-12 15:17:05 +08:00
@cevincheung 旧的可以用git做tag啊
|
8
sectic 2015-01-12 15:26:02 +08:00
给app的借口最好带有版本
|
9
siteshen 2015-01-12 15:29:29 +08:00
暂时没有加入版本的概念,只是实现API时,尽量做到向后兼容。实在遇到不兼容时,加入下面的代码:
if (version <= 1.5.4) { return 1.5; } else { return 2; } |
10
tabris17 2015-01-12 15:35:59 +08:00
这些版本都是同时使用的?
|
11
cevincheung OP |
12
tczzjin 2015-01-12 16:10:24 +08:00
在nginx层url重定向到目录吧,v1目录和v2目录都维护一套完整的api接口,
最好不要再class名字上做文章,管理起来很奇怪,也不利于ide解析生成文档啥的 |
13
Actrace 2015-01-12 16:19:36 +08:00
单独两套接口的意义是在以后你会降低维护成本。
一个接口多版本的意义是装哔。。。 |
14
ipconfiger 2015-01-12 16:27:06 +08:00
如果V2 的接口不存在就自动去V1去取数据就ok了,自动降级处理
|
15
tabris17 2015-01-12 16:31:30 +08:00
如果V1和V2的请求数据和返回数据格式不一样那就应该当作两个接口来处理
|
16
huigeer 2015-01-12 16:36:23 +08:00
版本: branch -> trunk -> prepareonline -> online
|
17
kukat 2015-01-12 20:14:15 +08:00
namespace
|
18
liuweisj 2015-01-13 10:52:06 +08:00
后端跑多个版本的项目, project-v1 , project-v2 用nginx 把http://host:[prot]/v1/query 的upstream配置到 project-v1的地址 ,http://host:[prot]/v2/query 的upstream配置到 project-v2的地址
|
19
yueyoum 2015-01-13 10:54:37 +08:00
做过这方面工作,当时是在url上做文章,后来一想,还是在 http request header 上弄比较好,不过原理是一样的:
url 或者 header 带版本信息 nginx 根据 url 或者 header 来分发请求 ver1 -> app1 ver2 -> app2 如果数据库改动太大,确实很难兼容的时候, 就版本客户端不让登录,强制升级 |
20
yueyoum 2015-01-13 10:56:50 +08:00
@cevincheung
>> 你意思是每个版本都是独立目录? 我是这个意思, 见上面解释 比如 已经部署了 web/myweb/ 然后升级到了 v2, 但以前的还要保留 那么 就 把v2 部署到 web/myweb-v2 也就是此时起了两个 web服务, 然后用nginx转发吧 |
22
curiousjude 2015-01-13 15:29:08 +08:00
不同版本的代码我们是分目录的,这样应该会比较好维护吧。比如升级到v2就创建一个v2的目录,这样v2版本的api就不会影响到v1的了。
|
23
limbo0 2015-01-13 20:16:18 +08:00
看许多网站的 API 都是这么做的
|
24
xiubao 2017-11-01 16:49:36 +08:00
用 DOClever 接口管理工具,自带接口管理、接口版本快照以及接口回滚;
|