用PHP编写一个APP的API

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

标签(空格分隔): 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

时间: 2024-10-21 03:37:01

用PHP编写一个APP的API的相关文章

PHP之如何编写一个Vue的API后台(一)

首先我们先建立文件的结构 如下图: components - 存放所有的全局方法,比如:autoplay的函数 lib - 所有第三方的方法  比如:DBTool:数据库的方法 logs -  日志 webroot - 整个api的入口文件,就是xxx.com访问的文件夹 config.php - 全局的设置 constant.php - 所有参数的设定,如 class SMS_USEFOR extends CONST_CLASS { const REGISTER = 1;//注册用验证码 co

Swift语言编写一个简单的条形码扫描APP

swift语言编写一个简单的条形码扫描APP 原文地址:appcoda 在处理职员在杂货店的收银台排了很长的队伍,在机场帮助检查背包和旅客,或者在主要的食品供应商,协助处理乏味的存货清单过程,条形码扫描是很简单的处理工具.实际上,他们已经用了这个办法来解决消费者在智能购物,图书分类,等其他目的.因此,让我们来制作一个iPhone版本的条形码扫描工具吧! 对我们来说幸运的是,苹果已经制作了条形码扫描的程序,实现它是一件很简单的事情.我们将要研究进入AV Foundation框架的世界,组建APP,

用weexplus从0到1写一个app(2)-页面跳转和文章列表及文章详情的编写

说明 结束连续几天的加班,最近的项目终于告一段落,今天抽点时间开始继续写我这篇拖了很久的<用weexplus从0到1写一个app>系列文章.写这篇文章的时候,weexplus的作者已经把weexplus重构了一下,可以同时打包出web端和native端,我这边的ui界面和项目结构也跟着做了一点变化.这里有weexplus官方放出的一个电影APP的demo,有需要的可以去下载看看,然后顺便给weexplus一个star吧! 文章可能会很长,在此分几篇文章来写,先占个坑: 用weexplus从0到

用Xamarin和Visual Studio编写iOS App

一说开发 iOS app,你立马就会想到苹果的开发语言 Objective C/Swift 和 Xcode.但是,这并不是唯一的选择,我们完全可以使用别的语言和框架. 一种主流的替换方案是 Xamarin,这是一个跨平台框架,允许你开发 iOS.Android 和 OSX.Windows app,它使用的是 C# 和 Visual Studio.最大的好处在于,Xamarin 允许你在 iOS 和 Android app 间共享代码. Xamarin 与其他跨平台框架相比有一个最大的好处:使用

用React Native编写跨平台APP

用React Native编写跨平台APP React Native 是一个编写iOS与Android平台实时.原生组件渲染的应用程序的框架.它基于React,Facebook的JavaScript的库,为的是构建用户接口,而并不是以浏览器为目标,它是以手机平台为目的. 换句话说,假设你是一个web开发人员,你能够使用React Native去编写干净.高速的移动APP,而且能够体会到熟悉的框架和单个的JavaScript的代码库. 在这之前,我们已经听到用诸如Cordova或者是Titaniu

如何开发一个App(Android)

前言 本篇博客从开发的角度来介绍如何开发一个Android App,需要说明一点是,这里只是提供一个如何开发一个app的思路,并不会介绍很多技术上的细节,从整个大局去把握如何去构思一个app的开发,让你对独立开发一款app的时候有个理解,如果有说的不对的地方,欢迎大家拍砖留言讨论. 开发环境 Android应用层使用的开发语言是Java,自然需要用到Java运行环境,无论你在Window是系统还是Mac系统都需要安装JDK,并且配置它的环境变量,不懂什么叫环境变量的或者不知道怎么配的,请利用好自

通过Intel XDK编写跨平台app(二)

通过Intel XDK编写跨平台app(一) 通过Intel XDK编写跨平台app(二) 在这个系列的上一篇文章中,我们大致了解了Interl XDK的概况.在这一部分中,我们会详细地介绍如何通过这个框架来构建app,这里我们会以一个简单的照片分享应用为例. 你可以在Github上找到这个例子的最终代码. 对比一下几个框架 Intel XDK 支持几种不同的HTML5架构: App Framework, Bootstrap, TopCoat 和JQuery Mobile. APP Design

尝鲜.net core2.1 ——编写一个global tool

本文内容参考微软工程师Nate McMaster的博文.NET Core 2.1 Global Tools 用过npm开发都知道,npm包都可以以全局的方式安装,例如安装一个http-server服务,可以使用npm i http-server -g来将http-server包安装到全局环境.安装完之后,就可以通过cmd或者powershell运行全局工具http-server命令,来使用静态托管服务.dotnet tool 就是一个类似npm全局工具的新特性,在.net core2.1正式加入

使用Cordova创建第一个App和Cordova构建环境的配置

引言 通过上一篇文章我们已经对 Hybrid App 有了一定的了解,并且根据实际业务情况选择了 Cordova 来开发我们的APP, 如果对这些还不了解的话请查看上一篇文章,那么接下来我们就开始Cordova 之旅把! 安装Cordova CLI 由于Cordova命令行工具作为npm包发布,这对于我们前端开发的同学来说实在是太方便了! #全局安装Cordova $ npm install -g cordova 注 :对于在OS X和Linux上, npm命令前加sudo 是因为 cordov