標籤(空格分隔): PHP 手機後臺 api 通訊接口 Andyphp
PHP是世界上最強大的語言。mysql
PHP開發手機API時,通常返回XML或JSON數據類型的數據,除了要返回從源數據(程序自己須要的數據)外還應附上狀態碼,如下是一段封裝後的數據,它使用JSON格式展示:sql
{ code: 200, message: "Success", data: [ { username: "安明哲", password: "123456", level: "1", gold: "0", id: "6", create_time: "2015-09-26 08:25:31", is_active: "1", is_admin: "0" }, { username: "張三", password: "12345", level: "1", gold: "0", id: "8", create_time: "0000-00-00 00:00:00", is_active: "1", is_admin: "0" } ] }
如下是XML格式數據的實例:json
<root> <code>200</code> <message>Success</message> <data> <item id="0"> <username>安明哲</username> <password>123456</password> <level>1</level> <gold>0</gold> <id>6</id> <create_time>2015-09-26 08:25:31</create_time> <is_active>1</is_active> <is_admin>0</is_admin> </item> <item id="1"> <username>張三</username> <password>12345</password> <level>1</level> <gold>0</gold> <id>8</id> <create_time>0000-00-00 00:00:00</create_time> <is_active>1</is_active> <is_admin>0</is_admin> </item> </data> </root>
此外,爲了方便手機端開發人員的調試,還可直接返回帶數據類型的數據:api
array(3) { ["code"]=> int(200) ["message"]=> string(7) "Success" ["data"]=> array(2) { [0]=> array(8) { ["username"]=> string(9) "安明哲" ["password"]=> string(6) "123456" ["level"]=> string(1) "1" ["gold"]=> string(1) "0" ["id"]=> string(1) "6" ["create_time"]=> string(19) "2015-09-26 08:25:31" ["is_active"]=> string(1) "1" ["is_admin"]=> string(1) "0" } [1]=> array(8) { ["username"]=> string(6) "張三" ["password"]=> string(5) "12345" ["level"]=> string(1) "1" ["gold"]=> string(1) "0" ["id"]=> string(1) "8" ["create_time"]=> string(19) "0000-00-00 00:00:00" ["is_active"]=> string(1) "1" ["is_admin"]=> string(1) "0" } } }
當手機客戶端經過API獲取數據時,PHP腳本會Response
一個數組,並對這個數組進行encode
,他們分別是json
,xml
和array
;該數組,定義以下:數組
$result = [ "code" => 200, "message" => "數據返回成功", "data" => ["key"=>"value", "key"=>"value"] ]
其中,code
表明狀態碼,message
表明狀態信息,data
是程序邏輯中須要的數據。dom
當手機端調用API,程序業務邏輯處理完成以後,須要返回數據,此時須要對通訊數據進行封裝,封裝的三種類型由可由REQUEST
裏的format
參數指定,當formart=json
時執行response_json
方法,同理,還有response_xml
和response_array
方法;測試
爲了方便調用,編寫一個Response
類來封裝數據並完成response
工做:fetch
/*本段代碼沒有通過實際環境測試,也沒有嚴謹的參數檢查*/ class Response{ public static function response_api($code, $message='', $data=array()){ //根據formart返回適當的數據 $type = isset($_REQUEST['format'])?$_REQUEST['format']:''; switch ($type) { case 'json': self::response_json($code, $message, $data); break; case 'xml': self::response_xml($code, $message, $data); break; case 'array': echo var_dump(self::grant_array($code, $message, $data)); break; default: self::response_json($code, $message, $data); break; } } public static function response_json($code, $message='', $data=array()){ //返回JSON數據 $result = self::gramt_array($code,$message,$data); echo json_encode($result); exit(); } public static function response_xml($code, $message='', $data=array()){ //返回XML數據 $result = self::gramt_array($code,$message,$data); $xml = "<?xml version='1.0' encoding='UTF-8'?>"; $xml .= "<root>"; $xml .= self::xml_encode($result); $xml .= "</root>" echo $xml; exit(); } private function xml_encode($arr=array()){ //對於XML,須要本身實現一個XML的encode方法 $xml = $attr = ''; foreach($arr as $key=>$value){ if(is_numberic($key)){ $key = 'item'; $attr = " id='{$key}'"; } $xml .= "<{$key}{$attr}>"; $xml .= (is_array($value))?self::xml_encode($value):$value; $xml .= "</{$key}>"; } return $xml; } private function grant_array($code, $message='', $data=array()){ //在全部操做以前,須要生成符合API規範的數組 $result = { "code" => $code, "message" => $message, "data" => $data }; return $result; } }
Response類實現了通訊接口的數據封裝,可根據response
內指定的format靈活的寫入不一樣格式的數據到Response。
付:完整代碼及調用實例:ui
<?php class Response{ /* * 封通訊接口數據 * @param integer $code 狀態碼 * @param string $message 狀態信息 * @param array $data 數據 * return string */ public static function api_response($code, $message='', $data=array()){ $type = isset($_REQUEST['format'])?$_REQUEST['format']:''; switch ($type) { case 'json': self::response_json($code, $message, $data); break; case 'xml': self::response_xml($code, $message, $data); break; case 'array': echo var_dump(self::grant_array($code, $message, $data)); break; default: self::response_json($code, $message, $data); break; } } /* * 封裝數爲爲json數據類型 * @param integer $code 狀態碼 * @param string $message 狀態信息 * @param array $data 數據 * return string */ public static function json_response($code, $message='', $data=array()){ $result = self::grant_array($code, $message, $data); echo json_encode($result); exit; } /* * 封裝數爲爲xml數據類型 * @param integer $code 狀態碼 * @param string $message 狀態信息 * @param array $data 數據 * return string */ public static function xml_response($code, $message='', $data=array()){ $result = self::grant_array($code, $message, $data); header("Content-Type:text/xml"); $xml = "<?xml version='1.0' encoding='UTF-8'?>\n"; $xml .= "<root>\n"; $xml .= self::xml_encode($result); $xml .= "</root>"; echo $xml; exit(); } /* * 將數組轉換爲XML格式 * @param array $array 數組 * return string */ private function xml_encode($array=array()){ $xml = $attr = ""; if(!empty($array)){ foreach ($array as $key => $value) { if(is_numeric($key)){ $attr = " id='{$key}'"; $key = "item"; } $xml .= "<{$key}{$attr}>" ; $xml .= is_array($value) ? self::xml_encode($value) : $value; $xml .="</{$key}>\n"; } } return $xml; } /* * 按照接口格式生成原數據數組 * @param integer $code 狀態碼 * @param string $message 狀態信息 * @param array $data 數據 * return array */ private function grant_array($code, $message='', $data=array()){ if(!is_numeric($code)){ return ''; } $result = array( 'code' => $code, 'message' => $message, 'data' => $data ); return $result; } }
調用實例:
<?php require_once "./DataBaseUtil.class.php"; require_once "./Response.class.php"; $connect = DataBaseUtil::getInstance()->connect(); /* * 首頁接口 * http://domain/hotgirl/callback.php?format=xml/json */ $page = isset($_REQUEST['page'])?$_REQUEST['page']:1; $page_number = isset($_REQUEST['page_number'])?$_REQUEST['page_number']:2; $lim_start = ($page-1) * $page_number; $sql = "SELECT * FROM user WHERE is_active=1 LIMIT ".$lim_start.",".$page_number; $result = mysql_query($sql, $connect); if($result && mysql_num_rows($result)>0) { while ($row = mysql_fetch_assoc($result)) { $rows[] = $row; } } if(!empty($rows)){ return Response::api_response(200, 'Success', $rows); } else{ return Response::api_response(403, 'No result from database'); }
原文地址:https://www.jianshu.com/p/0eca40163fcc