这两天看了关于xml、json格式的接口实现视频,在此做一个总结,发现按着视频码代码也会有坑。先把整个过程中我所不了解的知识,或者没有意识到的流程记录一下:
接口开发:
一、json与xml对比:
1、可读性:xml好;
2、生成数据方面:json好;
3、传输速度方面:json好;
二、app接口做的哪些事?
获取数据:从数据库或缓存中获取数据;
提交数据:通过接口提交数据给服务器;用get、post方式;
三、iconv('UTF-8','GBK',$arr);转化编码格式的函数,将数组的utf8格式转化为GBK
四、通信数据标准格式:
1、code:状态码(200,400等)
2、message:提示信息
3、data:返回数据
五、PHP生成xml数据
1、组装字符串;
2、DOMDocument类;
3、XMLWriter;
4、simpleqWriter;
六、缓存技术:memcache \redis
七、单例模式:一个类只能拥有一个实例;
1、构造函数非public;
2、拥有一个保存类的静态变量;
3、拥有一个实例化类的公共静态方法;
八、APP接口开发
方案一、读取数据库方式开发首页接口
应用场景:数据时效性比较高的系统!
1、从数据库获取信息;
2、封装;
3、生成接口数据;
方案二、读取缓存方式开发首页接口
用途:减少数据库压力
1、第一次从数据库获取信息后,将数据进行缓存;
2、之后的请求都从缓存中获取数据,就不需要再连接数据库了;
方案三、定时读取缓存方式开发首页接口
通过设置定时任务,提前将数据库数据获取出来进行缓存,然后
客户端发出请求时,服务器直接调用缓存数据;
九、使用Start BlueStacks安卓模拟器
十、静态缓存开发接口;
十一、基本参数传递方式和获取方法:
1、get
2、post
3、header $_SERVER获取(这个需要注意到)
接下来直接上代码,其实这段代码并不难,只是想把一段代码写规范,能够考虑清楚大部分情况比较难,这里记录一下我学到的,以及未来写代码需要注意的:
第一点:代码封装和包容性,此处将数组转化为xml、json格式代码进行了封装,并通过show函数按前端意愿进行调用。即前端想用xml格式数据,他们就可以在地址栏中加入参数format=xml;想用json格式数据可以不带参数;提供了较高的包容性,这是我目前需要学习的,这可能也是接口开发的基准——后端为前端服务。
第二点:注释。包括对此类的注释;对各个函数、传入函数的参数和数据类型、返回值类型的注释;当然还有某些较难理解的代码的注释;以及对某些出过错的代码的注释,不然久了就忘了(不过这个可以自己拿小本本记下,比如$xml .= "<{$key} {$attr}>";//两个变量之间需要加上空格!不然会报错!)。
第三点:对函数传参的一个把控,可能会提升代码效率?。比如show函数中的$type=self::JSON,如果是我可能就直接是$type="json"了,这里是用常量来提升代码效率吗?还是说是为了规范?这个需要自己去找答案。
第四点:整段代码用了四个函数,一开始并不清楚要用四个函数;只是在写的过程中,慢慢的进行提炼,精简;下面这段代码的流程是先定义json()—>xml()—>xmlencode()—>show();xmlencode()函数,只是为了能够输出我们想要的那种xml格式而努力。这段代码的注意点已经注释好了。
<?php
class Response{
const JSON = "json";
/*
*按type方式输出通信数据
*@param integer $code 状态码
*@param string $message 提示信息
*@param array $data 数据
*@param array $type 数据类型
*return string
*/
public static function show($code,$message='',$data=array(),$type=self::JSON){
if(!is_numeric($code)){
return "";
}
$type = isset($_GET['format']) ? $_GET['format']:self::JSON;
$result = array(
'code'=>$code,
'message'=>$message,
'data'=>$data,
);
if($type == 'json'){
return self::json($code,$message,$data);
exit;
}elseif($type == 'array'){
var_dump($result);
}elseif($type == 'xml'){
return self::xml($code,$message,$data);
exit;
}
}
/*
*按json方式输出通信数据
*@param integer $code 状态码
*@param string $message 提示信息
*@param array $data 数据
*return string
*/
public static function json($code,$message='',$data=array()){
if(!is_numeric($code)){
return '';
}
$result = array(
'code'=>$code,
'message'=>$message,
'data'=>$data,
);
return json_encode($result);
exit;
}
/*
*按xml方式输出通信数据
*@param integer $code 状态码
*@param string $message 提示信息
*@param array $data 数据
*return string
*/
public static function xml($code,$message,$data=array()){
if(!is_numeric($code)){
return "";
}
$result = array(
'code'=>$code,
'message'=>$message,
'data'=>$data,
);
header("Content-Type:text/xml");//发送http头信息,可查看xml格式数据
$xml = "<?xml version='1.0' encoding='UTF-8'?>";
$xml .= "<root>";
$xml .= "<code>".$code."</code>";
$xml .= "<message>".$message."</message>";
$xml .= "<data>";
$xml .= self::xmlencode($data);
$xml .= "</data>";
$xml .= "</root>";
return $xml;
exit;
}
/*
*对$data生成xml数据进行封装
*@param array $data 数据
*return string
*/
public static function xmlencode($data){
$xml = $attr = "";
foreach($data as $key => $value){
//xml节点不能为数字
if(is_numeric($key)){
$attr = "id='{$key}'";
$key = "item";
}
$xml .= "<{$key} {$attr}>";//这里需要加上空格!
//注意调用self::xmlencode!!!
$xml .= is_array($value) ? self::xmlencode($value) : $value;//采用递归
$xml .= "</{$key}>";
}
return $xml;
}
}
?>