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