W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
我們一直都建議在我們的項目中使用設(shè)計模式以便讓代碼更優(yōu)雅,但我們更推薦只在合適的場景才使用合適的設(shè)計模式,而不是為了“顯學(xué)”而生硬套用。設(shè)計模式又需要更高層的設(shè)計原則和工程思想作指導(dǎo),才能更正確被使用發(fā)揮其作用。
在PhalApi,正如前面所說的,我們引入并應(yīng)用了很多設(shè)計原則,一如單一職責(zé)原則SPR、開放-封閉原則OCP等。因此,在這里我們可以在phprpc的基礎(chǔ)上,利用代理模式優(yōu)雅地擴展實現(xiàn)phpcpr協(xié)議。
在需要使用phprpc協(xié)議進行接口調(diào)用的項目中,我們可以快速利用此擴展類庫。并且你會發(fā)現(xiàn),服務(wù)端的接口已有的代碼不需要做任何改動,只需要增加此擴展包和添加一個新入口便可完美切換。特別在項目中途BOSS說我們要提高接口調(diào)用的安全性而改用phprpc協(xié)議時。
從 PhalApi-Library 擴展庫中下載獲取 PHPRPC 微信包,如使用:
git clone https://git.oschina.net/dogstar/PhalApi-Library.git
然后把 PHPRPC 目錄復(fù)制到 ./PhalApi/Library/ 下,即:
cp ./PhalApi-Library/PHPRPC/ ./PhalApi/Library/ -R
到此安裝完畢!
可以參考下面的入口代碼編寫:
//$ vim ./Public/phprpc/index.php
<?php
require_once dirname(__FILE__) . '/../init.php';
//裝載你的接口
DI()->loader->addDirs(array('Demo', 'Library'));
$server = new PHPRPC_Lite();
$server->response();
這里以?service=User.GetBaseInfo為例進行說明。
在使用了phprpc協(xié)議后,我們再以瀏覽器(HTTP協(xié)議)訪問調(diào)用接口時,會預(yù)期地出現(xiàn)以下失敗信息:
如果通過phprpc協(xié)議調(diào)用,我們則可以得到接口返回的 源數(shù)據(jù) 。
假設(shè)請求的接口為:?service=User.GetBaseInfo&user_id=1,則可以得到我們熟悉的:
array (
'ret' => 200,
'data' =>
array (
'code' => 0,
'msg' => '',
'info' =>
array (
'id' => '1',
'name' => 'dogstar',
'note' => 'oschina',
),
),
'msg' => '',
)
同樣,為了方便進行phprpc協(xié)議下接口調(diào)用的調(diào)試,我們提供了一個腳本,如上面的對?service=User.GetBaseInfo&user_id=1調(diào)用,使用腳本即為:
$ 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) ""
}
雖然服務(wù)端不需要作出太多的改動,但對于客戶端來說,仍然需要進行三方面的調(diào)整以進行phprpc協(xié)議的調(diào)用以及參數(shù)的傳遞和返回結(jié)果的獲取。
現(xiàn)分說如下。
首當(dāng)其沖的就是調(diào)用方式的改變,但值得開心的是,phprpc對很多語言都有支持。具體可以查看phprpc官網(wǎng)。
其實對POST參數(shù)傳遞的改變??紤]到phprpc協(xié)議中對POST的數(shù)據(jù)有一定的復(fù)雜性,這里統(tǒng)一作了簡化。 正如我們下面的代碼所示:
public function response($params = NULL) {
$paramsArr = json_decode($params, TRUE);
if ($paramsArr !== FALSE) {
DI()->request = new PhalApi_Request(array_merge($_GET, $paramsArr));
}
我們約定: 通過第一個參數(shù)用JSON格式來傳遞全部原來需要POST的數(shù)據(jù) 。
當(dāng)POST的數(shù)據(jù)和GET的數(shù)據(jù)沖突時,以POST為準(zhǔn)。
所以,相應(yīng)地,當(dāng)需要傳遞POST參數(shù)時,客戶需要這樣調(diào)整(如PHP下):
$client->response(json_encode($params)))
如無此POST參數(shù),則可以忽略不傳。
最后,就是返回結(jié)果格式的改變。
在phprpc協(xié)議下,因為可以更輕松地獲取接口返回的源數(shù)據(jù),所以這里也同樣不再通過字符串流式的序列返回(如原來的JSON或XML),而是直接返回接口的 源數(shù)據(jù) 。如上面示例中所看到的結(jié)果一樣。
這點,需要特別注意。
phprpc官網(wǎng):http://www.phprpc.org/zh_CN/
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: