用PHP編寫一個APP的API

用PHP編寫一個APP的API

第一部分,通信接口的實現

標籤(空格分隔): PHP 手機後臺 api 通信接口 Andy


PHP是世界上最強大的語言。

PHP開發手機API時,一般返回XML或JSON數據類型的數據,除了要返回從源數據(程序本身需要的數據)外還應附上狀態碼,以下是一段封裝後的數據,它使用JSON格式展現:


{
    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格式數據的實例:


<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>

此外,爲了方便手機端開發人員的調試,還可直接返回帶數據類型的數據:


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,xmlarray;該數組,定義如下:


$result = [
    "code" => 200,
    "message" => "數據返回成功",
    "data" => ["key"=>"value", "key"=>"value"]
]

其中,code代表狀態碼,message代表狀態信息,data是程序邏輯中需要的數據。

如何去設計

當手機端調用API,程序業務邏輯處理完成之後,需要返回數據,此時需要對通信數據進行封裝,封裝的三種類型由可由REQUEST裏的format參數指定,當formart=json時執行response_json方法,同理,還有response_xmlresponse_array方法;

爲了方便調用,編寫一個Response類來封裝數據並完成response工作:


/*本段代碼沒有經過實際環境測試,也沒有嚴謹的參數檢查*/
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。
付:完整代碼及調用實例:

<?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

posted @ 2019-02-21 19:16 棲息地 閱讀(...) 評論(...) 編輯 收藏
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章