3.2.1 扩展类库:代理模式下phprpc协议的轻松支持

我们一直都建议在我们的项目中使用设计模式以便让代码更优雅,但我们更推荐只在合适的场景才使用合适的设计模式,而不是为了“显学”而生硬套用。设计模式又需要更高层的设计原则和工程思想作指导,才能更正确被使用发挥其作用。

在PhalApi,正如前面所说的,我们引入并应用了很多设计原则,一如单一职责原则SPR、开放-封闭原则OCP等。因此,在这里我们可以在phprpc的基础上,利用代理模式优雅地扩展实现phpcpr协议。

在需要使用phprpc协议进行接口调用的项目中,我们可以快速利用此扩展类库。并且你会发现,服务端的接口已有的代码不需要做任何改动,只需要增加此扩展包和添加一个新入口便可完美切换。特别在项目中途BOSS说我们要提高接口调用的安全性而改用phprpc协议时。

3.2.2 安装

(1)扩展包下载

PhalApi-Library 扩展库中下载获取 PHPRPC,如使用:

  1. $ git clone https://git.oschina.net/dogstar/PhalApi-Library.git

然后把 PHPRPC 目录复制到 ./PhalApi/Library/ 下,即:

  1. $ cp ./PhalApi-Library/PHPRPC/ ./PhalApi/Library/ -R

到此安装完毕!

3.2.3 入门使用

(1)phprpc协议入口

可以参考下面的入口代码编写:

  1. //$ vim ./Public/phprpc/index.php
  2. <?php
  3. require_once dirname(__FILE__) . '/../init.php';
  4. //装载你的接口
  5. DI()->loader->addDirs(array('Demo', 'Library'));
  6. $server = new PHPRPC_Lite();
  7. $server->response();

3.2.4 示例

这里以?service=User.GetBaseInfo为例进行说明。

(1)浏览器访问失败

在使用了phprpc协议后,我们再以浏览器(HTTP协议)访问调用接口时,会预期地出现以下失败信息:

0214

(2)通过phprpc协议调用

如果通过phprpc协议调用,我们则可以得到接口返回的 源数据 。假设请求的接口为:?service=User.GetBaseInfo&user_id=1,则可以得到我们熟悉的:

  1. array (
  2. 'ret' => 200,
  3. 'data' =>
  4. array (
  5. 'code' => 0,
  6. 'msg' => '',
  7. 'info' =>
  8. array (
  9. 'id' => '1',
  10. 'name' => 'dogstar',
  11. 'note' => 'oschina',
  12. ),
  13. ),
  14. 'msg' => '',
  15. )

3.2.5 phprpc协议调试

同样,为了方便进行phprpc协议下接口调用的调试,我们提供了一个脚本,如上面的对?service=User.GetBaseInfo&user_id=1调用,使用脚本即为:

  1. $ php ./Library/PHPRPC/check.php http://dev.phprpc.com/phprpc/?service=User.GetBaseInfo&userId=1
  2. array(3) {
  3. ["ret"]=>
  4. int(200)
  5. ["data"]=>
  6. array(3) {
  7. ["code"]=>
  8. int(0)
  9. ["msg"]=>
  10. string(0) ""
  11. ["info"]=>
  12. array(3) {
  13. ["id"]=>
  14. string(1) "1"
  15. ["name"]=>
  16. string(7) "dogstar"
  17. ["note"]=>
  18. string(7) "oschina"
  19. }
  20. }
  21. ["msg"]=>
  22. string(0) ""
  23. }

3.2.6 对客户端的调整

虽然服务端不需要作出太多的改动,但对于客户端来说,仍然需要进行三方面的调整以进行phprpc协议的调用以及参数的传递和返回结果的获取。

现分说如下。

(1)调用方式的改变

首当其冲的就是调用方式的改变,但值得开心的是,phprpc对很多语言都有支持。具体可以查看phprpc官网。

(2)POST参数传递方式的改变

其次对POST参数传递的改变。考虑到phprpc协议中对POST的数据有一定的复杂性,这里统一作了简化。正如我们下面的代码所示:

  1. public function response($params = NULL) {
  2. $paramsArr = json_decode($params, TRUE);
  3. if ($paramsArr !== FALSE) {
  4. DI()->request = new PhalApi_Request(array_merge($_GET, $paramsArr));
  5. }

我们约定: 通过第一个参数用JSON格式来传递全部原来需要POST的数据

当POST的数据和GET的数据冲突时,以POST为准。

所以,相应地,当需要传递POST参数时,客户需要这样调整(如PHP下):

  1. $client->response(json_encode($params)))

如无此POST参数,则可以忽略不传。

(3)返回结果格式的改变

最后,就是返回结果格式的改变。

在phprpc协议下,因为可以更轻松地获取接口返回的源数据,所以这里也同样不再通过字符串流式的序列返回(如原来的JSON或XML),而是直接返回接口的 源数据 。如上面示例中所看到的结果一样。

这点,需要特别注意。

3.2.7 参考

phprpc官网:http://www.phprpc.org/zh_CN/

原文: https://www.phalapi.net/wikis/3-2.html