代理模式下phprpc協(xié)議的輕松支持

2018-11-21 21:32 更新

3.2.1 擴展類庫:代理模式下phprpc協(xié)議的輕松支持

我們一直都建議在我們的項目中使用設(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é)議時。

3.2.2 安裝

(1)擴展包下載

 PhalApi-Library 擴展庫中下載獲取 PHPRPC 微信包,如使用:

git clone https://git.oschina.net/dogstar/PhalApi-Library.git

然后把 PHPRPC 目錄復(fù)制到 ./PhalApi/Library/ 下,即:

cp ./PhalApi-Library/PHPRPC/ ./PhalApi/Library/ -R

到此安裝完畢!

3.2.3 入門使用

(1)phprpc協(xié)議入口

可以參考下面的入口代碼編寫:

//$ 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協(xié)議后,我們再以瀏覽器(HTTP協(xié)議)訪問調(diào)用接口時,會預(yù)期地出現(xiàn)以下失敗信息:

0214

(2)通過phprpc協(xié)議調(diào)用

如果通過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' => '',
)

3.2.5 phprpc協(xié)議調(diào)試

同樣,為了方便進行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) ""
}

3.2.6 對客戶端的調(diào)整

雖然服務(wù)端不需要作出太多的改動,但對于客戶端來說,仍然需要進行三方面的調(diào)整以進行phprpc協(xié)議的調(diào)用以及參數(shù)的傳遞和返回結(jié)果的獲取。

現(xiàn)分說如下。

(1)調(diào)用方式的改變

首當(dāng)其沖的就是調(diào)用方式的改變,但值得開心的是,phprpc對很多語言都有支持。具體可以查看phprpc官網(wǎng)。

(2)POST參數(shù)傳遞方式的改變

其實對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ù),則可以忽略不傳。

(3)返回結(jié)果格式的改變

最后,就是返回結(jié)果格式的改變。

在phprpc協(xié)議下,因為可以更輕松地獲取接口返回的源數(shù)據(jù),所以這里也同樣不再通過字符串流式的序列返回(如原來的JSON或XML),而是直接返回接口的 源數(shù)據(jù) 。如上面示例中所看到的結(jié)果一樣。

這點,需要特別注意。

3.2.7 參考

phprpc官網(wǎng):http://www.phprpc.org/zh_CN/

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號