在 Yii 1.x 基础上做了一个 API Framework (轻喷, 实在不该怎么称呼它) 支持多版本分发到不同处理路由中

2016-01-28 16:26:07 +08:00
 jziwenchen

这个 API Framework 模式基本上是自己工作中用到的,然后来来回回反反复复最终决定集成到 Yii 核心中去.

我觉得最有意思的地方是根据不同的 version 加载不同的接口处理逻辑,并且在接口还不支持当前版本情况下会自动使用最新的接口版本.

接口的 URL 长的像这样:

http://domain.cn/user.info?v=1.2.0&uid=xxx&app_id=xx&sign=xxx&timestamp=xxx

现在还支持 签名验证 ,在配置文件中 给 不同的平台 像 iOS / Android 之类配一个不同的 app_id ,加强接口安全.

后面要做的:

  1. 接口日志

  2. 接口调用频率限制

  3. 更多的参数验证类

...

有兴趣的朋友可以提意见哈..

github:

https://github.com/jackey/YiiAPI-Framework

3969 次点击
所在节点    PHP
15 条回复
lawmil
2016-01-28 16:37:46 +08:00
亲你实现的这些功能, yii2.0 已经实现了
jziwenchen
2016-01-28 16:42:11 +08:00
@lawmil 是我看东西不认真嘛? 没看到 Yii 2.x 支持多版本的 API 呀?
lawmil
2016-01-28 17:01:09 +08:00
@jziwenchen http://www.yiichina.com/doc/guide/2.0/rest-versioning 不知道你说的多版本是不是这个。。。 yii 一直以来都是支持模块化,
jziwenchen
2016-01-28 17:10:23 +08:00
@lawmil

比如
user.info?v=1.0.0 的接口请求路由到

service/rest/v1.0.0/user/info.php 下去处理

user.info?v=1.1.0 的接口请求路由到

service/rest/v1.1.0/user/info.php 去处理

这样不同版本的发布 互不影响 功能也更加独立. 方便开发.
cszchen
2016-01-28 19:42:14 +08:00
写个组件就能实现了,何必该核心代码,以后怎么升级
再说都用 yii2 了
不过还是支持一下楼主
Outshine
2016-01-28 21:15:59 +08:00
根据 version 切换不同的接口版本
这个 YII2 已经实现了,并且支持 header 和 get 两种切换方式: https://github.com/yiisoft/yii2/blob/master/docs/guide-zh-CN/rest-versioning.md

接口日志
这个很简单,没注意 YII2 有木有

接口调用频率限制
这个也是有哒: https://github.com/yiisoft/yii2/blob/master/docs/guide-zh-CN/rest-rate-limiting.md

更多参数验证类:
不清楚什么意思
orvice
2016-01-29 00:12:09 +08:00
为啥还用 yii1 这种东西。。。
jziwenchen
2016-01-29 09:38:14 +08:00
@orvice 个人比较熟 然后做了不少 接口的产品啦... 然后自己想把完全个人化 之后用于项目上更加好维护
cai314494687
2016-01-29 10:08:51 +08:00
@Outshine 接口日志可以配置一下,分分钟解决
zhangxiaoman
2016-01-29 10:19:50 +08:00
目测楼主是给 app 做 api service , 要支持 app 多个版本同时正常运行..

我当时用了一种做法是.. 利用 namespace .. 做版本切换..
jziwenchen
2016-01-29 10:24:13 +08:00
@zhangxiaoman namesapce ? ?
lawmil
2016-01-29 10:39:36 +08:00
@jziwenchen 可以切换到 yii2 了。。你说的这些已经都实现了。。而且可以用 header 也可以用 route ,可以看看 yii2 的文档 restful 的这块。。
xujif
2016-01-29 11:13:20 +08:00
1,2,3 一般都放在代理层做掉了吧。。不然怎么搞轮询
zhangxiaoman
2016-01-29 16:55:37 +08:00
@jziwenchen
记错了.. 用 namespace 是当时为了区分每个版本的日志记录,我重写了一个日志处理.

有一种做法是. (我接手过一个公司的项目)
每一个版本对应一个文件夹.
根据 version 获取对应的文件夹.
动态设置 $app -> setControllerPath();

来做到兼容多个 app 版本的请求.



看到当时的注释 我也是醉醉的..

接手一个烂摊子.. 想去改成自己想要的样子已经很难了..
jziwenchen
2016-01-29 17:32:28 +08:00
@zhangxiaoman

想法其实差不多,基本上把不同版本的文件放在不同目录;

我做这个我主要是不想使用默认的 Yii CApplication , 它太重了, 加载很多了 components . 其实 API 接口这边不需要其他的 Components. 按需加载就可以了.

能接烂摊子也是一种挑战,我不知道接了多少烂摊子了 哈哈...~~~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/254028

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX