grape動態PHP結構(三)——API介面

來源:互聯網
上載者:User

標籤:

一、app視圖與控制器

1)路由

這裡的v1、v2就是模組,由於用戶端版本一直在迭代的,那麼一些老版本的用戶端調用的介面就得保留起來,使得相容。新版本就直接調用新介面。

還有一種是寫html頁面,在用戶端展示,只要把template檔案夾和data檔案夾加上就可以了。

Controller的配置如下,注意ismodule是true,module_list中的array:

$InitPHP_conf[‘ismodule‘] = true; //開啟module方式$InitPHP_conf[‘controller‘][‘path‘]                  = ‘controller‘;$InitPHP_conf[‘controller‘][‘controller_postfix‘]    = ‘Controller‘; //控制器檔案尾碼名$InitPHP_conf[‘controller‘][‘action_postfix‘]        = ‘‘; //Action函數名稱尾碼$InitPHP_conf[‘controller‘][‘default_controller‘]    = ‘index‘; //預設執行的控制器名稱$InitPHP_conf[‘controller‘][‘default_action‘]        = ‘index‘; //預設執行的Action函數$InitPHP_conf[‘controller‘][‘module_list‘]           = array(‘v1‘,‘v2‘); //module白名單$InitPHP_conf[‘controller‘][‘default_module‘]        = ‘v1‘; //預設執行module$InitPHP_conf[‘controller‘][‘default_before_action‘] = ‘before‘; //預設前置的ACTION名稱$InitPHP_conf[‘controller‘][‘default_after_action‘]  = ‘after‘; //預設後置ACTION名稱

這裡順便說下InitPHP的路由管理。InitPHP的架構URL路由分為三種形式,原生、path模式、rewrite模式,HTML模式。我這邊用的是rewrite模式。

1.原生模式:index.php?c=index&a=run

2.rewrite模式:/index/run/id=1 (需要開啟伺服器rewrite模組,並且配置.htaccess)

3.path模式:/index/run/id/1 (需要開啟伺服器rewrite模組,並且配置.htaccess)

4.html模式: user-index-run.htm?uid=100 (需要開啟伺服器rewrite模組,並且配置.htaccess)

 

2)類比session

這裡類比的方法比較簡單而粗暴。

在登入的時候,會產生一串字元,然後儲存到使用者表中,這串字元會返回給用戶端,作為session。

在登入後用戶端會將這串字元傳過來,伺服器再根據這串字元在搜尋使用者,從未擷取使用者資訊,並判斷是否已經登入。

 

二、apiController通用控制器類
public function __construct() {        parent::__construct();                $this->controller_name = $this->getC();        $this->action_name = $this->getA();        $this->module_name = $this->getM();                //訪問參數日誌記錄        $this->_logVisit();        //API統一介面為post提交        if (!$this->controller->is_post()) {            $this->output(constHelper::API_STATUS_NEED_POST, ‘必須為POST請求‘);        }                /**         * 請求參數樣本         * __ua=Android 4.4.4//MI 3W//26//2.0//865645022129866//////WIFI&         * __timestamp=1441854121116&         * mobile=13800138000&         * __version=2.0&         * __device=android&type=2&         * __key=67543fd413ce4d281fc93306597acb66         */        $device = $this->p(‘__device‘); //用戶端名稱        $timestamp = $this->p(‘__timestamp‘); //用戶端時間戳記        $key = $this->p(‘__key‘); //用戶端加密指紋        $session = $this->p(‘__session‘); //用戶端SESSION        $version = substr($this->p(‘__version‘), 0, 5); //用戶端版本                //用戶端最低版本號碼要求        if (strnatcmp($version, constHelper::MIN_VERSION_ALLOWED) < 0) { //用戶端需要升級            $this->output(constHelper::API_STATUS_NEED_UPGRADE, ‘用戶端需要升級‘);        }                //檢查密鑰        $this->_checkSecretKey($device, $timestamp, $key);                //判斷是否需要驗證登入        $needCheck = $this->_checkLogin();        if($needCheck && empty($session)) {            $this->output(constHelper::API_STATUS_NEED_LOGIN, ‘請先登入‘);        }                //根據session擷取使用者資訊        if(!empty($session)){            $memberModel = InitPHP::getMysqlDao(‘member‘);            $this->member = $memberModel->getMemberBySession($session);        }                //session沒有擷取到相關資訊 也要做跳轉        if($needCheck && empty($this->member)) {            $this->output(constHelper::API_STATUS_NEED_LOGIN, ‘請先登入‘);        }}

1)訪問參數日誌記錄

當用戶端發起一個請求的時候,會帶上很多參數,例如作業系統、目前的版本號、時間戳記、口令、網路、應用市場等資訊。

調用$this->_logVisit();將這些資訊全部存到MongoDB中,便於以後調試與追蹤。並且在返回參數的時候,將返回參數更新到這條請求記錄中。

 

2)output返回參數

返回參數的格式如下:

 {    "code":1000,    "msg":"hello\u6210\u529f",    "data":{        "result":1,        "obj":{"id":"55f57a4aa0105"}    }}    

code:是各種通用的錯誤編碼,我寫在了libraray/helper/dict/constHelper中,如上面的代碼所示,當驗證出現錯誤的時候,會顯示響應的code,並返回

msg:就是提示言,這裡做了Unicode編碼

data:返回的就是各種自訂參數,這裡僅列舉了通用的兩種

result:也是類似於code的定義,不同的是針對的是特定請求中的返回碼

obj:返回的就是個自訂對象,也可以是數組

 

3)密鑰匹配

為了保證請求的合法性,在用戶端和伺服器端約定一個密鑰,用戶端在根據這個密鑰做加密後,傳過來給伺服器端,服務端再加密然後做匹配。

伺服器端將密鑰設定在defined檔案中,IOS,Android可以定義的不同:

define(‘API_IOS_KEY‘, ‘DF_A98=D^&7$^%*9CNAhj0UO!!LM11‘);define(‘API_ANDROID_KEY‘, ‘KU98&)dsf8%@kji89dfadJK-800i122‘);define(‘API_UNKNOW_KEY‘, ‘[email protected](*kb66578-223q670933‘);

而驗證的規則也很簡單,時間戳記+密鑰再MD5加密:

private function _checkSecretKey($device, $timestamp, $key) {        //提取私人密鑰        $privateKey = ‘‘;        switch (strtolower($device)) {            case ‘ios‘:                $privateKey = API_IOS_KEY;                break;            case ‘android‘:                $privateKey = API_ANDROID_KEY;                break;            default:                $privateKey = API_UNKNOW_KEY;                break;        }                $keySource = $privateKey . $timestamp;        //用戶端安全認證失效        if (empty($key) || ($key != md5($keySource))) {            $this->outputCom(constHelper::API_STATUS_AUTH_FAIL, ‘安全認證失敗‘);        }}

 

4)各種驗證

1.第一個驗證是只接收post請求,這裡直接使用了InitPHP中的Request API。

2.用戶端最低版本號碼驗證,有時候用戶端需要強制升級

3.登入驗證,這裡有多種情況,有些API是不需要登入的,有些是需要登入的,而有些是既可以登入也可以不登入

 

三、API調試工具

在交付給用戶端之前,自己肯定要先測試一下的,這就需要一個簡易工具了,當然也可以選擇一些強大的工具,例如firefox的httprequester等。

在tool檔案夾下面,我已經把這個工具放在裡面了,執行頁面如下:

 

工具的檔案目錄也很淳樸,就五個檔案,有兩個地方需要配置:

 

1)在indexhtml中data-domain屬性,修改為你當前的api網域名稱,在第13行左右

 

2)在tk.php中,修改資料庫連接參數,以及用戶端密鑰

 

 

GitHub地址:

https://github.com/pwstrick/grape

grape動態PHP結構(三)——API介面

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.