在 Yii 1.x 基础上做了一个 API Framework (轻喷, 实在不该怎么称呼它) 支持多版本分发到不同处理路由中 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jziwenchen
V2EX    PHP

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

  •  
  •   jziwenchen 2016-01-28 16:26:07 +08:00 4624 次点击
    这是一个创建于 3594 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这个 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

    15 条回复    2016-01-29 17:32:28 +08:00
    lawmil
        1
    lawmil  
       2016-01-28 16:37:46 +08:00
    亲你实现的这些功能, yii2.0 已经实现了
    jziwenchen
        2
    jziwenchen  
    OP
       2016-01-28 16:42:11 +08:00
    @lawmil 是我看东西不认真嘛? 没看到 Yii 2.x 支持多版本的 API 呀?
    lawmil
        3
    lawmil  
       2016-01-28 17:01:09 +08:00
    @jziwenchen http://www.yiichina.com/doc/guide/2.0/rest-versioning 不知道你说的多版本是不是这个。。。 yii 一直以来都是支持模块化,
    jziwenchen
        4
    jziwenchen  
    OP
       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
        5
    cszchen  
       2016-01-28 19:42:14 +08:00
    写个组件就能实现了,何必该核心代码,以后怎么升级
    再说都用 yii2 了
    不过还是支持一下楼主
    Outshine
        6
    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
        7
    orvice  
       2016-01-29 00:12:09 +08:00
    为啥还用 yii1 这种东西。。。
    jziwenchen
        8
    jziwenchen  
    OP
       2016-01-29 09:38:14 +08:00
    @orvice 个人比较熟 然后做了不少 接口的产品啦... 然后自己想把完全个人化 之后用于项目上更加好维护
    cai314494687
        9
    cai314494687  
       2016-01-29 10:08:51 +08:00
    @Outshine 接口日志可以配置一下,分分钟解决
    zhangxiaoman
        10
    zhangxiaoman  
       2016-01-29 10:19:50 +08:00
    目测楼主是给 app 做 api service , 要支持 app 多个版本同时正常运行..

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

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

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



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

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

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

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

    能接烂摊子也是一种挑战,我不知道接了多少烂摊子了 哈哈...~~~
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5661 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 06:11 PVG 14:11 LAX 22:11 JFK 01:11
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86