用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
标签:message 数据 xml data param return array 状态 code result
智能推荐
用PHP编写一个APP的API的更多相关文章
- PHP之如何编写一个Vue的API后台(一)
首先我们先建立文件的结构 如下图: components - 存放所有的全局方法,比如:autoplay的函数 lib - 所有第三方的方法 比如:DBTool:数据库的方法 logs - 日志 ...
- JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识
JAVA WEB快速入门系列之前的相关文章如下:(文章全部本人[梦在旅途原创],文中内容可能部份图片.代码参照网上资源) 第一篇:JAVA WEB快速入门之环境搭建 第二篇:JAVA WEB快速入门之 ...
- 用weexplus从0到1写一个app(2)-页面跳转和文章列表及文章详情的编写
说明 结束连续几天的加班,最近的项目终于告一段落,今天抽点时间开始继续写我这篇拖了很久的<用weexplus从0到1写一个app>系列文章.写这篇文章的时候,weexplus的作者已经把w ...
- .NET Core RC2发布在即,我们试着用记事本编写一个ASP.NET Core RC2 MVC程序
在.NET Core 1.0.0 RC2即将正式发布之际,我也应应景,针对RC2 Preview版本编写一个史上最简单的MVC应用.由于VS 2015目前尚不支持,VS Code的智能感知尚欠火候,所 ...
- 成都app开发:架构一个App需要学会哪些技术呢?
成都亿合科技小编为您分享: 随着APP应用的流行,越来越多的人想自己学习怎么开发APP应用,那架构一个APP需要学些什么技术呢?首先要了解App都有哪些类型,不同的类型适用于哪些需求,用户可以根据自己 ...
- 用Xamarin和Visual Studio编写iOS App
一说开发 iOS app,你立马就会想到苹果的开发语言 Objective C/Swift 和 Xcode.但是,这并不是唯一的选择,我们完全可以使用别的语言和框架. 一种主流的替换方案是 Xamar ...
- 用weexplus从0到1写一个app
说明 基于wexplus开发app是来新公司才接触的,之前只是用过weex体验过写demo,当时就被用vue技术栈来开发app的开发体验惊艳到了,这个开发体验比react native要好很多,对于我 ...
- 通过Intel XDK编写跨平台app(二)
通过Intel XDK编写跨平台app(一) 通过Intel XDK编写跨平台app(二) 在这个系列的上一篇文章中,我们大致了解了Interl XDK的概况.在这一部分中,我们会详细地介绍如何通过这 ...
- 用React Native编写跨平台APP
用React Native编写跨平台APP React Native 是一个编写iOS与Android平台实时.原生组件渲染的应用程序的框架.它基于React,Facebook的JavaScript的 ...
随机推荐
- 关于OSG+QT+VS版本的问题
CMake3.10.0 Qt5.11.0安装包只有VS2017_64版本,没有VS2017的32位版本,有VS2015的32位版本 Qt5.11.0+osg3.4在CMake的时候,会出现 CMake ...
- Java枚举根据key获取value
package com.utcip.crm.common.constants; import com.utcip.crm.common.base.process.ScheduleStatusEnum; ...
- 这样理解 HTTPS 更容易(Maybe)
摘要:本文尝试一步步还原HTTPS的设计过程,以理解为什么HTTPS最终会是这副模样.但是这并不代表HTTPS的真实设计过程.在阅读本文时,你可以尝试放下已有的对HTTPS的理解,这样更利于“还原”过 ...
- 关于bat中使用rar压缩命令
数据库备份,导出的dmp 文件比较大,需要压缩,压缩后大小能变为原来十分之一左右吧. 写的是批处理的语句,每天调用,自动导出dmp 文件,压缩删除原文件. 首先写下路径 先将压缩软件的路径写入系统的环 ...
- LeetCode 37 Sudoku Solver(求解数独)
题目链接: https://leetcode.com/problems/sudoku-solver/?tab=Description Problem : 解决数独问题,给出一个二维数组,将这个数独 ...
- Linux下重启mysql的时候出现 start: Job failed to start
mysql进程自己退出了,使用如下指令确认mysql进程不在了. ps -ef | grep mysql 看不到mysql进程 mysql进程不在,尽快回复服务的想法,就是重启服务 /etc/init ...
- STM8L外部中断 为何 死循环 寄存器操作
STM8L 系列单片机是 ST公司推出的低功耗单片机,与STM8S系列相比功耗降低了很多,但内部结构也删减了很多,使用时一定要仔细阅读手册. 这是第一次使用STM8,实现功能不是很复杂就没想研究库函 ...
- 【CF908G】New Year and Original Order 数位DP
[CF908G]New Year and Original Order 题意:令S(i)表示将i中所有数位上的数拿出来,从小到大排序后组成一个新的数的值.如S(50394)=3459.求$\sum\l ...
- java的HashMap 原理
https://www.cnblogs.com/chengxiao/p/6059914.html 哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比 ...
- JDK1.8版本,java并发框架支持锁包括
1.自旋锁,自旋,jvm默认是10次,由jvm自己控制,for去争取锁 2.阻塞锁 被阻塞的线程,不会争夺锁 3.可重入锁,多次进入改锁的域 4.读写锁 5.互斥锁,锁本身就是互斥的 6.悲观锁,不相 ...