##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協議)訪問調用接口時,會預期地出現以下失敗信息:

###(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:接口文檔參考模板