3.2.1 扩展类库:代理模式下phprpc协议的轻松支持
我们一直都建议在我们的项目中使用设计模式以便让代码更优雅,但我们更推荐只在合适的场景才使用合适的设计模式,而不是为了“显学”而生硬套用。设计模式又需要更高层的设计原则和工程思想作指导,才能更正确被使用发挥其作用。
在PhalApi,正如前面所说的,我们引入并应用了很多设计原则,一如单一职责原则SPR、开放-封闭原则OCP等。因此,在这里我们可以在phprpc的基础上,利用代理模式优雅地扩展实现phpcpr协议。
在需要使用phprpc协议进行接口调用的项目中,我们可以快速利用此扩展类库。并且你会发现,服务端的接口已有的代码不需要做任何改动,只需要增加此扩展包和添加一个新入口便可完美切换。特别在项目中途BOSS说我们要提高接口调用的安全性而改用phprpc协议时。
3.2.2 安装
(1)扩展包下载
从 PhalApi-Library 扩展库中下载获取 PHPRPC,如使用:
$ git clone https://git.oschina.net/dogstar/PhalApi-Library.git
然后把 PHPRPC 目录复制到 ./PhalApi/Library/ 下,即:
$ cp ./PhalApi-Library/PHPRPC/ ./PhalApi/Library/ -R
到此安装完毕!
3.2.3 入门使用
(1)phprpc协议入口
可以参考下面的入口代码编写:
//$ 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协议)访问调用接口时,会预期地出现以下失败信息:
(2)通过phprpc协议调用
如果通过phprpc协议调用,我们则可以得到接口返回的 源数据 。假设请求的接口为:?service=User.GetBaseInfo&user_id=1,则可以得到我们熟悉的:
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调用,使用脚本即为:
$ 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的数据有一定的复杂性,这里统一作了简化。正如我们下面的代码所示:
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下):
$client->response(json_encode($params)))
如无此POST参数,则可以忽略不传。
(3)返回结果格式的改变
最后,就是返回结果格式的改变。
在phprpc协议下,因为可以更轻松地获取接口返回的源数据,所以这里也同样不再通过字符串流式的序列返回(如原来的JSON或XML),而是直接返回接口的 源数据 。如上面示例中所看到的结果一样。
这点,需要特别注意。
3.2.7 参考
phprpc官网:http://www.phprpc.org/zh_CN/