app接口开发(php)
1.JSON方式封装通信接口:
封装: response.php
<?php
// JSON方式封装通信接口
// 定义 response类
class Response {
// 定义一个静态方法,作用:按json方式产生数据
// 规范通信数据:参数一:状态码,参数二:消息提示(初始值为空),参数三:组装后的数据(初始值为空数组)
// 注释码:
/**
* 按json方式输出通信数据
* @param integer(数字类型) $code 状态码
* @param string(字符串类型) $message 提示信息
* @param array(数组类型) $data 数据
* return(返回值) string(字符串类型)
*/
public static function json($code,$message = '',$data = array()){
// 判断$code是否为数字
if(!is_numeric($code)){
return '';
}
//将三个参数组装成一个新的数组
$result = array(
'code' => $code,
'message' => $message,
'data' => $data
);
// 通过json_encode(),产生json数据
echo json_encode($result);
// exit 终止程序且不输出
exit;
}
} ?>
调用:test.php
<?php
// 加载Response类文件
require_once('./response.php');
// 定义一个数组变量
$arr = array(
'id' => 1,
'name' => 'zhangsan'
); // 调用类文件中的json()方法
Response::json(200,'数据返回成功',$arr);
?>
2.XML方式封装通信接口
2.0.1 PHP生成xml数据
封装: response.php
public static function xml(){
// header 发送一个http头信息,将类型改为"text/xml",用于暴露xml节点
header("Content-Type:text/xml");
// 生成xml数据(通过字符串拼接的方法,首先定义一个变量$xml,存储xml数据)
// \n 用于换行
$xml = "<?xml version='1.0' encoding='UTF-8'?>\n"; // 头信息
$xml .= "<root>\n"; // 根节点
$xml .= "<code>200</code>\n"; // 主体1
$xml .= "<message>数据返回成功</message>\n"; // 主体2
$xml .= "<data>\n"; // 主体3
$xml .= "<id>1</id>\n";
$xml .= "<name>zhangsan</name>\n";
$xml .= "</data>\n";
$xml .= "</root>"; // 输出拼接后的xml数据
echo $xml;
}
2.0.2 xml方式封装通信数据接口
封装: response.php
<?php
// 定义 response类
class Response {
// xml方式封装通信接口
// 定义一个静态方法,作用:按xml方式产生数据
// 规范通信数据:参数一:状态码,参数二:消息提示(初始值为空),参数三:组装后的数据(初始值为空数组)
// 注释码:
/**
* 按xml方式输出通信数据
* @param integer(数字类型) $code 状态码
* @param string(字符串类型) $message 提示信息
* @param array(数组类型) $data 数据
* return(返回值) string(字符串类型)
*/
public static function xmlEncode($code,$message,$data = array()){
// 判断$code是否为数字
if(!is_numeric($code)){
return '';
}
//将三个参数组装成一个新的数组
$result = array(
'code' => $code,
'message' => $message,
'data' => $data
);
// 生成xml数据
// 发送header头信息,用于暴露xml节点
header("Content-Type:text/xml");
// 定义变量$xml,用于存储拼接后的xml数据
$xml = "<?xml version='1.0' encoding='UTF-8'?>\n"; // 头信息
$xml .= "<root>\n"; // 根节点
// 使用xmlToEncode()方法解析$result
$xml .= self::xmlToEncode($result);
$xml .= "</root>"; // 输出拼接后的xml数据
echo $xml;
} // 将$result拼接成新的xml数据
// 参数:$data(新的数据),例如:$result
public static function xmlToEncode($data){
// 解析$result
// 定义变量$xml存储数据
$xml = "";
// 初始化 $attr,当$key不为数字时,$attr为空
$attr = "";
// foreach循环遍历$data数组
foreach ($data as $key => $value) {
// 判断$key为数字的情况
if(is_numeric($key)){
// 添加属性
$attr = "id='{$key}'";
$key = "item";
} // $key是一个节点,$value是节点的一个数据,使用{}用于识别变量
$xml .= "<{$key}{$attr}>\n"; // 开始标签
// $value是数组,使用递归,循环输出(判断是否为数组,如果是,则再次调用xmlToEncode方法)
// 在一个类的方法(函数)的上下文中,静态变量和函数被访问使用self:: ,通过is_array()判断$value是否为数组
$xml .= is_array($value) ? self::xmlToEncode($value):$value; // 节点的数据
$xml .= "</{$key}>\n"; // 结束标签
}
// 循环结束后,输出这一块组装好的xml数据
return $xml;
}
} // 调用Response类的方法
$data = array(
'id' => 1,
'name' => 'zhangsan'
);
Response::xmlEncode(200,'success',$data); ?>
3.综合方式封装通讯接口:
封装: response.php
<?php
// 定义 response类
class Response {
// 综合方式封装通信接口
// 定义一个静态方法,作用:综合方式产生数据
// 规范通信数据:参数一:状态码,参数二:消息提示(初始值为空),参数三:组装后的数据(初始值为空数组),参数四:数据类型(初始值为json)
// 注释码:
/**
* 按综合方式输出通信数据
* @param integer(数字类型) $code 状态码
* @param string(字符串类型) $message 提示信息
* @param array(数组类型) $data 数据
* @param string(字符串类型) $type 数据类型
* return(返回值) string(字符串类型)
*/
// 定义常量,默认数据类型
const JSON = "json";
public static function show($code,$message = '',$data = array(),$type = self::JSON){
// 判断$code是否为数字
if(!is_numeric($code)){
return '';
}
// 判断类型,如果存在,则是通过get方法传来的值,如果不存在,则是默认值json
$type = isset($_GET['format'])?$_GET['format']:self::JSON; //将四个参数组装成一个新的数组数据
$result = array(
'code' => $code,
'message' => $message,
'data' => $data
); // 如果数据类型为json
if($type == 'json'){
// 调用json()方法
self::json($code,$message,$data);
exit;
}elseif($type == 'array') {
// 如果数据类型为array(调试模式)
// 直接输出$result
var_dump($result);
}elseif($type == 'xml') {
// 如果数据类型为xml
// 调用xmlEncode()方法
self::xmlEncode($code,$message,$data);
exit;
}else{
// 其他类型
}
} // JSON方式封装通信接口
// 定义一个静态方法,作用:按json方式产生数据
// 规范通信数据:参数一:状态码,参数二:消息提示(初始值为空),参数三:组装后的数据(初始值为空数组)
// 注释码:
/**
* 按json方式输出通信数据
* @param integer(数字类型) $code 状态码
* @param string(字符串类型) $message 提示信息
* @param array(数组类型) $data 数据
* return(返回值) string(字符串类型)
*/
public static function json($code,$message = '',$data = array()){
// 判断$code是否为数字
if(!is_numeric($code)){
return '';
}
//将三个参数组装成一个新的数组
$result = array(
'code' => $code,
'message' => $message,
'data' => $data
);
// 通过json_encode(),产生json数据
echo json_encode($result);
// exit 终止程序且不输出
exit;
} // xml方式封装通信接口
// 定义一个静态方法,作用:按xml方式产生数据
// 规范通信数据:参数一:状态码,参数二:消息提示(初始值为空),参数三:组装后的数据(初始值为空数组)
// 注释码:
/**
* 按xml方式输出通信数据
* @param integer(数字类型) $code 状态码
* @param string(字符串类型) $message 提示信息
* @param array(数组类型) $data 数据
* return(返回值) string(字符串类型)
*/
public static function xmlEncode($code,$message,$data = array()){
// 判断$code是否为数字
if(!is_numeric($code)){
return '';
}
//将三个参数组装成一个新的数组
$result = array(
'code' => $code,
'message' => $message,
'data' => $data
);
// 生成xml数据
// 发送header头信息,用于暴露xml节点
header("Content-Type:text/xml");
// 定义变量$xml,用于存储拼接后的xml数据
$xml = "<?xml version='1.0' encoding='UTF-8'?>\n"; // 头信息
$xml .= "<root>\n"; // 根节点
// 使用xmlToEncode()方法解析$result
$xml .= self::xmlToEncode($result);
$xml .= "</root>"; // 输出拼接后的xml数据
echo $xml;
} // 将$result拼接成新的xml数据
// 参数:$data(新的数据),例如:$result
public static function xmlToEncode($data){
// 解析$result
// 定义变量$xml存储数据
$xml = "";
// 初始化 $attr,当$key不为数字时,$attr为空
$attr = "";
// foreach循环遍历$data数组
foreach ($data as $key => $value) {
// 判断$key为数字的情况
if(is_numeric($key)){
// 添加属性
$attr = "id='{$key}'";
$key = "item";
} // $key是一个节点,$value是节点的一个数据,使用{}用于识别变量
$xml .= "<{$key}{$attr}>\n"; // 开始标签
// $value是数组,使用递归,循环输出(判断是否为数组,如果是,则再次调用xmlToEncode方法)
// 在一个类的方法(函数)的上下文中,静态变量和函数被访问使用self:: ,通过is_array()方法判断$value是否为数组
$xml .= is_array($value) ? self::xmlToEncode($value):$value; // 节点的数据
$xml .= "</{$key}>\n"; // 结束标签
}
// 循环结束后,输出这一块组装好的xml数据
return $xml;
}
} // 调用Response类的方法
$data = array(
'id' => 1,
'name' => 'zhangsan'
);
Response::xmlEncode(200,'success',$data); ?>
调用:test.php
<?php
// 加载Response类文件
require_once('./response.php');
// 定义一个数组变量
$data = array(
'id' => 1,
'name' => 'zhangsan',
'type' => array(4,5,6),
'test' => array(1,45,67=>array(123,'tsysa'))
); // 调用类文件中的show()方法
Response::show(200,'数据返回成功',$data,'json'); ?>
4.将数据缓存值指定文件中:
封装:file.php
<?php
// 定义类,作用:处理静态缓存
class File {
// 定义默认路径 $_dir
private $_dir;
// 定义文件后缀
const EXT = '.txt';
// 将默认路径放在构造函数里面
public function __construct(){
// dirname(__FILE__)获取文件当前目录(即当前php文件所在的目录)
// 设置默认缓存文件地址
$this->_dir = dirname(__FILE__).'/files/';
}
// 将获取缓存,生成缓存,删除缓存 封装在一个方法中
// 参数一:缓存文件的文件名,参数二:缓存数据(默认值为空),参数三:保存缓存的文件路径(默认值为空)
public function cacheData($key,$value = '',$path = ''){
// 拼装成一个文件
$filename = $this->_dir.$path.$key.self::EXT;
// 判断$values是否存在
if($value!==''){// 将value值写入缓存
// 判断$value是否为null,为null则删除缓存
if(is_null($value)){
// unlink() 删除缓存
return @unlink($filename);
}
// 获取文件目录
$dir = dirname($filename);
// 判断目录是否存在,即判断存储缓存的文件是否存在,如果不存在,则创建缓存文件
if(!is_dir($dir)){
// 创建目录,参数一:文件目录名,参数二:设置权限
mkdir($dir,0777);
}
// 将缓存数据写入文件
// 参数一:缓存文件名,参数二:缓存数据(只能是字符串的形式,通过json_encode()转换)
return file_put_contents($filename,json_encode($value));
} // 判断$filename是否存在
if(!is_file($filename)){
return FALSE;
}else{
// file_get_contents()获取缓存值
// json_decode()将json 转换为数组形式
return json_decode(file_get_contents($filename),true); // 传入true返回原值
}
}
} ?>
调用:test.php
<?php
// 加载Response类文件
require_once('./file.php');
// 定义一个数组变量
$data = array(
'id' => 1,
'name' => 'zhangsan',
'type' => array(4,5,6),
'test' => array(1,45,67=>array(123,'tsysa'))
); // new一个File类
$file = new File();
// 调用cacheData()方法
$file->cacheData('index_mk_cache',$data);
// 添加缓存
if($file->cacheData('index_mk_cache',$data)){
echo "success";
}else{
echo "error";
}
// 获取缓存
if($file->cacheData('index_mk_cache'){
var_dump($file->cacheData('index_mk_cache'));
exit;
echo "success";
}else{
echo "error";
}
// 删除缓存
if($file->cacheData('index_mk_cache',null)){
echo "success";
}else{
echo "error";
} ?>
.
// 开始封装:
通用:db.php
<?php
// 单例模式连接数据库
// 单例模式(限制类只能拥有一个实例)
// 定义一个类
class Db {
// 配置数据库
private $_dbConfig = array(
'host' => '127.0.0.1', // 数据库地址
'user' => 'root', // 用户名
'password' => '', // 密码
'database' => 'video', // 数据库名
);
// 定义资源标识符(结果集)
static private $_connectSource;
// 用于一个保存类的实例的静态成员变量 $_instance
// 使用静态私有变量保存类的实例
static private $_instance;
// __construct() 构造函数,函数执行时默认执行,一般用于初始化
// 单例模式规定构造函数必须是非public
private function __construct(){ }
// 拥有一个访问这个实例的公共的静态方法
// 定义getInstance()方法,便于在类的内部实例化类
static public function getInstance(){
// 检查类有没有被实例,如果有则返回变量
if(!(self::$_instance instanceof self)){
// 实例化类
self::$_instance = new self();
}
// 返回一个类的实例
return self::$_instance;
} // php连接数据库
public function connect(){
// 判断资源是否存在
if(!self::$_connectSource){
// 连接数据库
// @是可以屏蔽函数执行过程中遇到问题而产生的一些错误、警告信息,这样用户就看不到程序的出错信息。这样除了用户界面会友好一些外,更重要的是安全性,因为屏蔽了出错文件的路径等信息。
self::$_connectSource = @mysql_connect($this->_dbConfig['host'],$this->_dbConfig['user'],$this->_dbConfig['password']);
// 如果没有返回资源
if(!self::$_connectSource){
die('数据库连接失败'.mysql_error());
}
// 选择数据库
// 参数一:数据库名称,参数二:资源标识符(结果集)
mysql_select_db($this->_dbConfig['database'],self::$_connectSource);
// 设置字符集
mysql_query("set names UTF8",self::$_connectSource);
}
// 返回连接数据库的资源
return self::$_connectSource;
} } // 调用
// 数据库的连接,返回结果集
$connect = Db::getInstance()->connect();
var_dump($connect); ?>
方案一:读取数据库方式开发接口(直接连接数据库获取)
实例:list.php
<?php
// 引入接口类
require_once('./response.php');
// 数据库
require_once('./db.php');
// 接口样例:http://app.com/list.php?page=1&pagesize=10
// 定义页码,并判断是否存在,如果不存在给予默认值
$page = isset($_GET['page']) ? $_GET['page'] : 1;
$pageSize = isset($_GET['pagesize']) ? $_GET['pagesize'] : 1;
// 验证传值是否合法,判断是否为数字
if(!is_numeric($page)||!is_numeric($pageSize)){
// 生成接口数据
// 通过return告知其他工程师,下面程序不执行
return Response::show(401,'数据不合法');
}
// 编写SQL语句
// order by XXX desc :倒序排序
// limit 起始位置,数据条数
$offset = ($page - 1) * $pageSize;
$sql = "select * from video where status = 1 order by orderby desc limit".$offset.",".$pageSize;
// 捕获异常
try{
// $connect:连接标识符
$connect = Db::getInstance()->connect();
}else(Exception $e){
// 提示异常
return Response::show(403,'数据库连接失败');
}
// $result:资源标识符(结果集)
$result = mysql_query($sql,$connect);
// 定义一个空数组,用于存储数据
$videos = array();
// while循环输出所有的数据
while($video = mysql_fetch_assoc($result)) {
// 每次循环,自动生成id,且值会放入$videos数组中
$videos[] = $video;
} // 使用Response类中的方法,将$videos中的数据转换为json格式
// Response::show('状态码','提示语句','原始数据')
if($videos){
return Response::show(200,'首页数据获取成功',$videos);
}else{
return Response::show(400,'首页数据获取失败',$videos);
}
?>
方案二:读取缓存方式开发接口(连接数据库获取的同时缓存一份,再次获取时不再连接数据库,而是读取缓存,可设置缓存失效时间)
方案三:定时读取缓存方式开发接口(通过crontab)
app接口开发(php)的更多相关文章
- Dcloud课程4 如何进行APP接口开发
Dcloud课程4 如何进行APP接口开发 一.总结 一句话总结:通过json或者xml. 1.APP如何进行通信? 通过在地址上接参数指明传递的数据的类型.而数据传递的类型一般是XML和json. ...
- APP 接口开发及读取静态缓存
<?php /** * Description: App 接口 * Create date:2015-10-19 13:36 * Author: zhaoyingnan **/ class Re ...
- app接口开发
最近一段时间一直在做APP接口,总结一下APP接口开发过程中的注意事项: 1.效率:接口访问速度 APP有别于WEB服务,对服务器端要求是比较严格的,在移动端有限的带宽条件下,要求接口响应速度要快,所 ...
- PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [3] 首页 APP 接口开发方案 ② 读取缓存方式
以静态缓存为例. 修改 file.php line:11 去掉 path 参数(方便),加上缓存时间参数: public function cacheData($k,$v = '',$cacheTim ...
- php做APP接口开发,接口的安全性
1.当用户登录APP时,使用https协议调用后台相关接口,服务器端根据用户名和密码时生成一个access_key,并将access_key保存在session(或者保存在redis)中,将生成的ac ...
- PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [4] 首页 APP 接口开发方案 ③ 定时读取缓存方式
用于 linux 执行 crontab 命令生成缓存的文件 crop.php <?php //让crontab 定时执行的脚本程序 require_once 'db.php'; require_ ...
- PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [2] 首页 APP 接口开发方案 ① 读取数据库方式
方案一:读取数据库方式 从数据库读取信息→封装→生成接口数据 应用场景: 数据时效性比较高的系统 方案二:读取缓存方式 从数据库获取信息(第一次设置缓存或缓存失效时)→封装(第一次设置缓存或缓存失效时 ...
- 【APP接口开发】php输出json格式数据
请一定配合使用null转空字符的方法一起使用:(_unsetNull() 和 _json() 配合使用) 在一些接口的调用中,直接查询数据库出来的字段可能为null字段,但是为了简便前端的判断,需要把 ...
- 【APP接口开发】php获取body数据
PHP获取接口数据: $postStr = file_get_contents("php://input");//因为很多都设置了register_globals禁止,不能用$GL ...
随机推荐
- Laravel开启跨域的方法
1.建立中间件Cors.php 命令:php artisan make:middleware Cors 在/app/Http/Middleware/ 目录下会出现一个Cors.php 文件. 内容如下 ...
- [thinkphp] 是如何输出一个页面的
表面上看,TP输出一个页面很简单:$this->display(); 实际上是怎么回事呢?$this->display(); 这个display()方法是定义在ThinkPHP/Libra ...
- android9.0请求异常
抛出异常:CLEARTEXT communication to not permitted by network security policy android 9开始默认不能使用http 1.在re ...
- POJ 3984 迷宫问题【BFS/路径记录/手写队列】
迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 31428 Accepted: 18000 Description 定义 ...
- 洛谷——P1134 阶乘问题
P1134 阶乘问题 题目描述 也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如: 12! = 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x 11 x 12 ...
- 手动安装python3和xgboost
yum install openssl-devel -y .tar.xz cd Python- ./configure --prefix=/usr/local/python3.5.4 make mak ...
- NULL always return false
Any comparison with null is false - = and <>, >, <, and so on. You cannot use null in an ...
- 【树链剖分】【dfs序】【线段树】bzoj2836 魔法树
这道题告诉我们:树链剖分的重标号就是dfs序. #include<cstdio> #include<algorithm> using namespace std; #defin ...
- Python学习实践 | speech智能语音模块
最近的生活.学习节奏很是容易被打断,终于,在今天,既实习结束之后,夏令营也结束了. 前几天,一个人在复习地很累的时候,又重新将Python捡了起来,看了挺多的知识点. 真是太有意(wu)思(liao) ...
- Asp.Net MVC part6 WebAPI
两种web服务SOAP风格:基于方法,产品是WebServiceREST风格:基于资源,产品是WebAPI可以返回json.xml类型的数据对于数据的增.删.改.查,提供相对的资源操作,按照请求的类型 ...