標籤:
一、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介面