codecamp

代理模式下phprpc协议的轻松支持

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协议)访问调用接口时,会预期地出现以下失败信息:

0214

(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/

微信开发
基于PHPMailer的邮件发送
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

八、视频教程

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }