##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/
- 欢迎使用PhalApi!
- 接口,从简单开始!
- [1.1]-下载与安装
- [1.2]-创建一个自己的项目
- [1.3]-在线体验
- [1.4]-文档、帮助和官网
- [1.10]-对PhalApi框架的抉择
- [1.11]-快速入门(backup)
- [1.12]-参数规则:接口参数规则配置
- [1.13]-统一的接口请求方式:_sevice=XXX.XXX
- [1.14]-统一的返回格式和结构:ret-data-msg
- [1.15]-数据库操作:基于NotORM的使用及优化
- [1.16]-配置读取:内外网环境配置的完美切换
- [1.17]-日记纪录:简化版的日记接口
- [1.18]-快速函数:人性化的关怀
- [1.19]-DI服务速查:各资源服务一览表
- [1.20]-DB操作:数据库基本操作速查
- [1.21]-类的自动加载:遵循PEAR包的命名规范
- [1.22]-签名验证:自定义签名规则
- [1.23]-请求和响应:GET和POST两者皆可得及超越JSON格式返回
- [1.24]-缓存策略:更灵活地可配置化的多级缓存
- [1.25]-国际化翻译:为走向国际化提前做好翻译准备
- [1.26]-数据安全:数据对称加密方案
- [1.27]-精益开发:更富表现力的Model层和重量级数据获取的应对方案
- [1.28]-COOKIE:对COOKIE原生态的支持及记忆加密升级版
- [1.29]-开放与封闭:多入口和统一初始化
- [1.30]-保持的力量:接口开发最佳实践
- [1.31]-新型计划任务:以接口形式实现的计划任务
- [2.11]-核心思想:DI依赖注入-让资源更可控
- [2.12]-海量数据:可配置的分库分表
- [2.13]-接口调试:在线SQL语句查看与性能优化
- [2.14]-测试驱动开发:意图导向编程下的接口开发
- [2.15]-演进:新型计划任务续篇
- [2.16]-领域驱动设计:应对复杂领域业务的Domain层
- [2.17]-微服务:Api接口服务层
- [2.18]-定制化:资源服务的再实现
- [2.19]-扩展库:可重用的扩展类库
- [2.20]-约定编程:架构明显的编程风格
- [2.21]-服务器统一部署方案简明版:CentOs---Nginx---php-fpm---MySql-[--Memcached]
- [2.22]-更多工具:精益项目和团队建设
- [3.1]-扩展类库:微信开发
- [3.2]-扩展类库:代理模式下phprpc协议的轻松支持
- [3.3]-扩展类库:基于PHPMailer的邮件发送
- [3.4]-扩展类库:优酷开放平台接口调用
- [3.5]-扩展类库:七牛云存储接口调用
- [3.6]-扩展类库:新型计划任务
- [3.8]-扩展类库:用户、会话和第三方登录集成
- [3.9]-扩展类库:swoole支持下的长链接和异步任务实现
- [3.11]-扩展类库:基于FastRoute的快速路由
- [4.2]-开发实战2:模拟优酷开放平台接口项目开发
- [4.3]-开发实战3:一个简单的小型项目开发(奔跑吧兄弟投票活动)
- [5.1]-架构与思想:PhalApi核心设计和思想解读
- [5.2]-杂谈:扯一些PhalApi的前世和今生
- [5.3]-框架总结:术语表和PHP开发建议
- [5.4]-许可
- [5.5]-联系和加入我们
- [5.6]-更新日记
- [5.8]-致框架贡献者:加入PhalApi开源指南
- [6.1]-基于接口查询语言的SDK包
- [6.2]-SDK包(JAVA版)
- [6.3]-SDK包(PHP版)
- [6.4]-SDK包(Objective-C版)
- [6.5]-SDK包(javascript版)
- [6.6]-SDK包(Ruby版)
- [8.1]-PhalApi视频教程
- 附录1:接口文档参考模板