ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
##3.2.1 扩展类库:代理模式下phprpc协议的轻松支持 我们一直都建议在我们的项目中使用设计模式以便让代码更优雅,但我们更推荐只在合适的场景才使用合适的设计模式,而不是为了“显学”而生硬套用。设计模式又需要更高层的设计原则和工程思想作指导,才能更正确被使用发挥其作用。 在PhalApi,正如前面所说的,我们引入并应用了很多设计原则,一如单一职责原则SPR、开放-封闭原则OCP等。因此,在这里我们可以在phprpc的基础上,利用代理模式优雅地扩展实现phpcpr协议。 在需要使用phprpc协议进行接口调用的项目中,我们可以快速利用此扩展类库。并且你会发现,服务端的接口已有的代码不需要做任何改动,只需要增加此扩展包和添加一个新入口便可完美切换。特别在项目中途BOSS说我们要提高接口调用的安全性而改用phprpc协议时。 ##3.2.2 安装 ###(1)扩展包下载 从 [PhalApi-Library](http://git.oschina.net/dogstar/PhalApi-Library) 扩展库中下载获取 **PHPRPC** 微信包,如使用: ```javascript git clone https://git.oschina.net/dogstar/PhalApi-Library.git ``` 然后把 **PHPRPC** 目录复制到 **./PhalApi/Library/** 下,即: ```javascript cp ./PhalApi-Library/PHPRPC/ ./PhalApi/Library/ -R ``` 到此安装完毕! ##3.2.3 入门使用 ###(1)phprpc协议入口 可以参考下面的入口代码编写: ```javascript //$ vim ./Public/phprpc/index.php <?php require_once dirname(__FILE__) . '/../init.php'; //装载你的接口 DI()->loader->addDirs(array('Demo', 'Library')); $server = new PHPRPC_Lite(); $server->response(); ``` ##3.2.4 示例 这里以?service=User.GetBaseInfo为例进行说明。 ###(1)浏览器访问失败 在使用了phprpc协议后,我们再以浏览器(HTTP协议)访问调用接口时,会预期地出现以下失败信息: ![0214](http://webtools.qiniudn.com/20150411005257_3ee80900ce60ca4b1ab5facd5bc4450c) ###(2)通过phprpc协议调用 如果通过phprpc协议调用,我们则可以得到接口返回的 **源数据** 。 假设请求的接口为:?service=User.GetBaseInfo&user_id=1,则可以得到我们熟悉的: ```javascript array ( 'ret' => 200, 'data' => array ( 'code' => 0, 'msg' => '', 'info' => array ( 'id' => '1', 'name' => 'dogstar', 'note' => 'oschina', ), ), 'msg' => '', ) ``` ##3.2.5 phprpc协议调试 同样,为了方便进行phprpc协议下接口调用的调试,我们提供了一个脚本,如上面的对?service=User.GetBaseInfo&user_id=1调用,使用脚本即为: ```javascript $ php ./Library/PHPRPC/check.php http://dev.phprpc.com/phprpc/?service=User.GetBaseInfo&userId=1 array(3) { ["ret"]=> int(200) ["data"]=> array(3) { ["code"]=> int(0) ["msg"]=> string(0) "" ["info"]=> array(3) { ["id"]=> string(1) "1" ["name"]=> string(7) "dogstar" ["note"]=> string(7) "oschina" } } ["msg"]=> string(0) "" } ``` ##3.2.6 对客户端的调整 虽然服务端不需要作出太多的改动,但对于客户端来说,仍然需要进行三方面的调整以进行phprpc协议的调用以及参数的传递和返回结果的获取。 现分说如下。 ###(1)调用方式的改变 首当其冲的就是调用方式的改变,但值得开心的是,phprpc对很多语言都有支持。具体可以查看phprpc官网。 ###(2)POST参数传递方式的改变 其实对POST参数传递的改变。考虑到phprpc协议中对POST的数据有一定的复杂性,这里统一作了简化。 正如我们下面的代码所示: ```javascript public function response($params = NULL) { $paramsArr = json_decode($params, TRUE); if ($paramsArr !== FALSE) { DI()->request = new PhalApi_Request(array_merge($_GET, $paramsArr)); } ``` 我们约定: **通过第一个参数用JSON格式来传递全部原来需要POST的数据** 。 当POST的数据和GET的数据冲突时,以POST为准。 所以,相应地,当需要传递POST参数时,客户需要这样调整(如PHP下): ```javascript $client->response(json_encode($params))) ``` 如无此POST参数,则可以忽略不传。 ###(3)返回结果格式的改变 最后,就是返回结果格式的改变。 在phprpc协议下,因为可以更轻松地获取接口返回的源数据,所以这里也同样不再通过字符串流式的序列返回(如原来的JSON或XML),而是直接返回接口的 **源数据** 。如上面示例中所看到的结果一样。 这点,需要特别注意。 ##3.2.7 参考 phprpc官网:http://www.phprpc.org/zh_CN/