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数据)
		// 
 用于换行
		$xml = "<?xml version='1.0' encoding='UTF-8'?>
"; // 头信息
		$xml .= "<root>
"; // 根节点
		$xml .= "<code>200</code>
"; // 主体1
		$xml .= "<message>数据返回成功</message>
"; // 主体2
		$xml .= "<data>
"; // 主体3
		$xml .= "<id>1</id>
";
		$xml .= "<name>zhangsan</name>
";
		$xml .= "</data>
";
		$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'?>
"; // 头信息
		$xml .= "<root>
"; // 根节点
		// 使用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}>
"; // 开始标签
			// $value是数组,使用递归,循环输出(判断是否为数组,如果是,则再次调用xmlToEncode方法)
			// 在一个类的方法(函数)的上下文中,静态变量和函数被访问使用self:: ,通过is_array()判断$value是否为数组
			$xml .= is_array($value) ? self::xmlToEncode($value):$value; // 节点的数据
			$xml .= "</{$key}>
"; // 结束标签
		}
		// 循环结束后,输出这一块组装好的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'?>
"; // 头信息
		$xml .= "<root>
"; // 根节点
		// 使用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}>
"; // 开始标签
			// $value是数组,使用递归,循环输出(判断是否为数组,如果是,则再次调用xmlToEncode方法)
			// 在一个类的方法(函数)的上下文中,静态变量和函数被访问使用self::  ,通过is_array()方法判断$value是否为数组
			$xml .= is_array($value) ? self::xmlToEncode($value):$value; // 节点的数据
			$xml .= "</{$key}>
"; // 结束标签
		}
		// 循环结束后,输出这一块组装好的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)

原文地址:https://www.cnblogs.com/crazycode2/p/6915055.html