用PHP編寫一個(gè)APP的API

第一部分,通信接口的實(shí)現(xiàn)

標(biāo)簽(空格分隔): PHP 手機(jī)后臺(tái) api 通信接口 Andy


PHP是世界上最強(qiáng)大的語(yǔ)言哪廓。

PHP開發(fā)手機(jī)API時(shí)泛领,一般返回XML或JSON數(shù)據(jù)類型的數(shù)據(jù),除了要返回從源數(shù)據(jù)(程序本身需要的數(shù)據(jù))外還應(yīng)附上狀態(tài)碼号杠,以下是一段封裝后的數(shù)據(jù)闭树,它使用JSON格式展現(xiàn):

{
    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格式數(shù)據(jù)的實(shí)例:

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

此外耸棒,為了方便手機(jī)端開發(fā)人員的調(diào)試,還可直接返回帶數(shù)據(jù)類型的數(shù)據(jù):

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

如何實(shí)現(xiàn)

當(dāng)手機(jī)客戶端通過API獲取數(shù)據(jù)時(shí)报辱,PHP腳本會(huì)Response一個(gè)數(shù)組榆纽,并對(duì)這個(gè)數(shù)組進(jìn)行encode,他們分別是json,xmlarray;該數(shù)組,定義如下:

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

其中奈籽,code代表狀態(tài)碼,message代表狀態(tài)信息鸵赫,data是程序邏輯中需要的數(shù)據(jù)衣屏。

如何去設(shè)計(jì)

當(dāng)手機(jī)端調(diào)用API,程序業(yè)務(wù)邏輯處理完成之后辩棒,需要返回?cái)?shù)據(jù)狼忱,此時(shí)需要對(duì)通信數(shù)據(jù)進(jìn)行封裝,封裝的三種類型由可由REQUEST里的format參數(shù)指定一睁,當(dāng)formart=json時(shí)執(zhí)行response_json方法钻弄,同理,還有response_xmlresponse_array方法者吁;

為了方便調(diào)用窘俺,編寫一個(gè)Response類來(lái)封裝數(shù)據(jù)并完成response工作:

/*本段代碼沒有經(jīng)過實(shí)際環(huán)境測(cè)試,也沒有嚴(yán)謹(jǐn)?shù)膮?shù)檢查*/
class Response{
    public static function response_api($code, $message='', $data=array()){
        //根據(jù)formart返回適當(dāng)?shù)臄?shù)據(jù)
        $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數(shù)據(jù)
        $result = self::gramt_array($code,$message,$data);
        echo json_encode($result);
        exit();
    }
    
    public static function response_xml($code, $message='', $data=array()){
        //返回XML數(shù)據(jù)
        $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()){
        //對(duì)于XML复凳,需要自己實(shí)現(xiàn)一個(gè)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規(guī)范的數(shù)組
        $result = {
            "code" => $code,
            "message" => $message,
            "data" => $data
        };
        return $result;
    }
    
}

Response類實(shí)現(xiàn)了通信接口的數(shù)據(jù)封裝,可根據(jù)response內(nèi)指定的format靈活的寫入不同格式的數(shù)據(jù)到Response育八。
付:完整代碼及調(diào)用實(shí)例:

<?php 
class Response{ 
    /*
    * 封通信接口數(shù)據(jù)
    * @param integer $code 狀態(tài)碼
    * @param string $message 狀態(tài)信息
    * @param array $data 數(shù)據(jù)
    * 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;
        }
    }

    /*
    * 封裝數(shù)為為json數(shù)據(jù)類型
    * @param integer $code 狀態(tài)碼
    * @param string $message 狀態(tài)信息
    * @param array $data 數(shù)據(jù)
    * return string 
    */
    public static function json_response($code, 
        $message='', $data=array()){
        $result = self::grant_array($code, $message, $data);
        echo json_encode($result);
        exit;
    }

    /*
    * 封裝數(shù)為為xml數(shù)據(jù)類型
    * @param integer $code 狀態(tài)碼
    * @param string $message 狀態(tài)信息
    * @param array $data 數(shù)據(jù)
    * 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();
    }

    /*
    * 將數(shù)組轉(zhuǎn)換為XML格式
    * @param array $array 數(shù)組
    * 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;
    }

    /*
    * 按照接口格式生成原數(shù)據(jù)數(shù)組
    * @param integer $code 狀態(tài)碼
    * @param string $message 狀態(tài)信息
    * @param array $data 數(shù)據(jù)
    * 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;
    }
}

調(diào)用實(shí)例:

<?php 

require_once "./DataBaseUtil.class.php";
require_once "./Response.class.php";
    
$connect = DataBaseUtil::getInstance()->connect();


/*
* 首頁(yè)接口 
* 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');
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末对途,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子髓棋,更是在濱河造成了極大的恐慌实檀,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件按声,死亡現(xiàn)場(chǎng)離奇詭異膳犹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)儒喊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門镣奋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人怀愧,你說(shuō)我怎么就攤上這事侨颈。” “怎么了芯义?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵哈垢,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我扛拨,道長(zhǎng)耘分,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮求泰,結(jié)果婚禮上央渣,老公的妹妹穿的比我還像新娘。我一直安慰自己渴频,他們只是感情好芽丹,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卜朗,像睡著了一般拔第。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上场钉,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天蚊俺,我揣著相機(jī)與錄音,去河邊找鬼逛万。 笑死泳猬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的泣港。 我是一名探鬼主播暂殖,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼当纱!你這毒婦竟也來(lái)了呛每?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤坡氯,失蹤者是張志新(化名)和其女友劉穎晨横,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箫柳,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡手形,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悯恍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片库糠。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖涮毫,靈堂內(nèi)的尸體忽然破棺而出瞬欧,到底是詐尸還是另有隱情,我是刑警寧澤罢防,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布艘虎,位于F島的核電站,受9級(jí)特大地震影響咒吐,放射性物質(zhì)發(fā)生泄漏野建。R本人自食惡果不足惜属划,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望候生。 院中可真熱鬧同眯,春花似錦、人聲如沸唯鸭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肿孵。三九已至,卻和暖如春疏魏,著一層夾襖步出監(jiān)牢的瞬間停做,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工大莫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛉腌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓只厘,卻偏偏與公主長(zhǎng)得像烙丛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子羔味,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,527評(píng)論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理河咽,服務(wù)發(fā)現(xiàn),斷路器赋元,智...
    卡卡羅2017閱讀 134,601評(píng)論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)忘蟹、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,033評(píng)論 4 62
  • 有趣文叔閱讀 342評(píng)論 5 4
  • 隨著塞爾比一桿解球失誤白球落袋搁凸,上海大師賽也就此落下帷幕媚值,我們終于等到了最好的結(jié)局,丁俊暉夢(mèng)圓上海灘护糖,霸氣奪冠褥芒!這...
    小二郎i閱讀 327評(píng)論 0 0