继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

用PHP编写一个APP的API

android也疯狂
关注TA
已关注
手记 279
粉丝 39
获赞 243

第一部分,通信接口的实现

标签(空格分隔): PHP 手机后台 api 通信接口 Andy

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,xml和array;该数组,定义如下:

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

其中,code代表状态码,message代表状态信息,data是程序逻辑中需要的数据。

如何去设计

当手机端调用API,程序业务逻辑处理完成之后,需要返回数据,此时需要对通信数据进行封装,封装的三种类型由可由REQUEST里的format参数指定,当formart=json时执行response_json方法,同理,还有response_xml和response_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');}

Robot抓取来源:去原网站

PS:抓取这篇文章是由于本人认可这种方案


原文地址:用PHP编写一个APP的API

智能推荐

  • 开启 NFS 文件系统提升 Vagrant 共享目录的性能

  • MYSQL 命令行显示乱码 解决方案

  • 新购买的vps应该做的几件事情

  • nginx处理问题笔记

  • 来看看这20个顶尖的开源项目!

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP