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(新的数据),例如:$resultpublic 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);// 如果数据类型为jsonif($type == 'json'){// 调用json()方法self::json($code,$message,$data);exit;}elseif($type == 'array') {// 如果数据类型为array(调试模式)// 直接输出$resultvar_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(新的数据),例如:$resultpublic 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 {// 定义默认路径 $_dirprivate $_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() 构造函数,函数执行时默认执行,一般用于初始化// 单例模式规定构造函数必须是非publicprivate 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)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290174.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何优雅地处理 EF Core 异常

前言当我们在使用 EF Core 保存数据时&#xff0c;可能会出现问题&#xff0c;比如插入重复的值&#xff0c;这时我们会收到DbUpdateException&#xff1a;如果把内部异常信息直接返回给客户&#xff0c;这样不太友好&#xff0c;同时也会暴露数据库细节。如何更优雅地处理这些…

利用 VMware vRealize - 构建和优化云管理

2019独角兽企业重金招聘Python工程师标准>>> 利用 VMware vRealize - 构建和优化云管理 VMware vCloud Suite 5.8是新一代基于软件定义数据中心架构构建与管理vSphere私有云的一体化产品&#xff0c;可支持各企业提升效率、控制性与灵活性&#xff0c;实现关键性的I…

linux c之在终端如何依赖.o文件(静态链接库)运行C文件的命令

1、问题 比如在linux的终端&#xff0c;我们运行有个aa.c文件&#xff0c;但是这个这C文件又依赖.o文件&#xff0c;之前我不知道怎么运行&#xff0c;今天才知道,直接放后面就行了 2、命令如下 gcc -g aa.c ***.o -o aa 如果有线程记得加上phread gcc -g aa.c ***.o -o…

合流超几何函数_【初中数学大招流】从平面几何到解析几何

写在前面&#xff1a;本文适合初三学生&#xff1b;本文所讲的方法&#xff0c;可供平时的学习开拓思维&#xff0c;考试时也许可以帮你得分&#xff0c;但请慎用&#xff01;创作不易&#xff0c;喜欢的话不要只收藏呀&#xff0c;双击屏幕有惊喜哦~2019.6.2 更新了一道例题&a…

NOIP2012模拟试题【奶牛晒衣服】

1&#xff0e;奶牛晒衣服(dry) 【问题描述】 在熊大妈英明的带领下&#xff0c;时针和它的同伴生下了许多牛宝宝。熊大妈决定给每个宝宝都穿上可爱的婴儿装。于是&#xff0c;为牛宝宝洗晒衣服就成了很不爽的事情。 圣人王担负起了这个重任。洗完衣服后&#xff0c;你就要弄干衣…

PYTHON REQUESTS的安装与简单运用

PYTHON REQUESTS的安装与简单运用 2013.07.09强烈推荐&#xff01;requests官方文档已有了中文版&#xff0c;请见http://cn.python-requests.org/zh_CN/latest/ 。 requests是python的一个HTTP客户端库&#xff0c;跟urllib&#xff0c;urllib2类似&#xff0c;那为什么要用re…

7. 堪比JMeter的.Net压测工具 - Crank 总结篇 - crank带来了什么

1. 前言通过上面的学习&#xff0c;我们已经了解清楚crank的职责以及作用&#xff0c;那么我们重新回来思考一下&#xff0c;crank能为我们带来什么&#xff1f;2. Crank带来了什么&#xff1f;为分布式压测提供了解决方案、可以模拟更高强度的压测单机压测最多提供65535&#…

3732: Network

3732: Network Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 395 Solved: 179[Submit][Status]Description 给你N个点的无向图 (1 < N < 15,000)&#xff0c;记为&#xff1a;1…N。 图中有M条边 (1 < M < 30,000) &#xff0c;第j条边的长度为&#xff1a; …

Android编译出现XML or text declaration not at start of entity

1、问题 运行Android项目的时候提示出现这个XML or text declaration not at start of entity 日了狗前几天都正常2、解决办法 原来是我的一个xml文件的头部有空格&#xff0c;去掉了就好了。

我的CSDN,我的编程生涯

我的CSDN&#xff0c;我的编程生涯&#xff0c;由此开始&#xff0c;加油&#xff01;

里rust怎么找蓝图_Rust错误处理

错误处理是程序开发中必不可少的一个环节&#xff0c;在Rust中&#xff0c;错误分成两个类别&#xff1a;可恢复错误和不可恢复错误。 可恢复错误&#xff1a;比如说未找到文件&#xff0c;Rust中用Result<T,E>来实现 不可恢复错误&#xff1a;比如数组访问越界&#xff…

转载牛X文章

2019独角兽企业重金招聘Python工程师标准>>> Java中有关Null的9件事&#xff1a; http://www.importnew.com/14229.html 深入理解java异常处理机制&#xff1a; http://blog.csdn.net/hguisu/article/details/6155636 Android JNI知识简介&#xff1a; http://blog.…

Android Listview中Button按钮点击事件冲突解决办法

今天做项目时&#xff0c;ListView中含有了Button组件&#xff0c;心里一早就知道肯定会有冲突&#xff0c;因为以前就遇到过&#xff0c;并解决过&#xff0c;可惜当时没有记录下来。 今天在做的时候&#xff0c;继续被这个问题郁闷了一把&#xff0c;后来解决后&#xff0c;赶…

使用.Net6中的System.Text.Json遇到几个常见问题及解决方案

前言以前.NetCore是不内置JSON库的&#xff0c;所以大家都用Newtonsoft的JSON库&#xff0c;而且也确实挺好用的&#xff0c;不过既然官方出了标准库&#xff0c;那更方便更值得我们多用用&#xff0c;至少不用每次都nuget安装Newtonsoft.Json库了。不过日常开发使用中会有一些…

Android开发之运行客户的Demo拿不到数据

1、问题 自己照着客户的Demo写发现拿不到数据&#xff0c;很奇怪&#xff0c;检查不出哪里有问题2、思考 我自己写的东西和Demo本质上没有区别&#xff0c;但是就是拿不到数据&#xff0c;这尴尬了&#xff0c;后面发现我是在onCreate里面直接初始化然后马上调用&#xff0c;客…

C#系统开发登录窗体在MDI窗体之前显示

通常,系统运行时的启动窗体是MDI窗体,起作用的是main()函数的Application.Run(new Mdi())语句,但我们的效果是先显示登录窗体,再显示Mdi窗体。此时,如果将该句改为Application.Run(new Login()),运行时虽可出现登录窗体Login,但Mdi窗体会闪一下然后隐藏。解决办法: …

python测试之道pdf百度云_Python测试之道——笔记1

引言如果利用python做自动化测试的话&#xff0c;一些python相关的基础知识是必须要掌握的。常用的比如&#xff1a;python代码规范、变量与数据类型、运算、函数和字符串处理等。语法规范这里只介绍重点和常用的一些注意事项。在使用python编码的时候&#xff0c;我们应该严格…

libcurl实现解析(3) - libcurl对select的使用

1.前言 在本系列的前一篇文章中。介绍了libcurl对poll()的使用。參考"libcurl原理解析(2) - libcurl对poll的使用"。 本篇文章主要分析curl_poll()中对select()的封装使用。与前一篇类似&#xff0c;我们仅仅分离出与select相关的代码。 2.curl_poll函数分析 这个函数…

C#子窗体运行时无法正常最大化的解决办法

通常情况下,要是一个窗体运行时最大化,最简单的做法就是鼠标捏一下将窗体的WindowState属性设为Maximized。但要是一个窗体是MDI的子窗体的话,以上做法就失灵了!这是我们就选择用代码控制,示例代码如下: Education_Train TE = new Education_Train(); TE.MdiParent = thi…

C和指针之高级指针话题通过函数指针实现在链表中找到特定的值

1、问题 通过函数指针实现在链表中找到特定的值,这里可以是int 类型或者char *类型 思路: 整形数据自己写比较函数,字符串比较用strcmp,然后把这个函数指针传递到函数作为参数。 2、代码实现 #include <stdio.h> #include <string.h>typedef struct No…