php写一个完整的app,用PHP编写一个APP的API

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

标签(空格分隔): PHP 手机后台 api 通信接口 AndyPHP是世界上最强大的语言。

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格式数据的实例:

200

Success

安明哲

123456

1

0

6

2015-09-26 08:25:31

1

0

张三

12345

1

0

8

0000-00-00 00:00:00

1

0

此外,为了方便手机端开发人员的调试,还可直接返回带数据类型的数据: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 .= "";

$xml .= self::xml_encode($result);

$xml .= ""

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 .= "";

$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 .= "\n";

$xml .= self::xml_encode($result);

$xml .= "";        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 .= "" ;

$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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值