前言
本文主要给大家介绍了关于php常用操作类之通信数据封装类实现的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍:
必要性
不管在b/s架构中,还是c/s架构中,两端的数据通信(注:这里的通信是指的网络请求和回复操作)都无可避免,因为没有数据便没有内容,没有内容,又有什么意义 :)
一般来说c/s架构通信执行流程如下:
而b/s架构通信执行流程像这样:
选择
既然数据通信,不可避免,那应该选择哪种通信方式比较好呢?目前来看服务器与客户端进行数据传输与交互的方式主要有url、xml、json三种方式。
url方式是最常用也是最直接的,通常用于get方法,其实我认为post中的form表单实质上也是url方式,但这种传输方式数据有限,也不规范,只适合一些简单场景。xml和json实质上都是对数据的描述,目的是对复杂数据进行分割、包装、规范化等一系列处理,方便数据传输和解析,相对来说json比xml更轻巧但却更灵活强大,举个例子:用以上两种方式表示我的个人信息如下:
json:
{"name":"entner","age":21,"gender":"男"}
xml:
<root>
<name>entner</name>
<age>21</age>
<gender>男</gender>
</root>
有兴趣的读者,可以参看后面的参考链接,写的非常详细。
如何封装?
上面讲了,xml和json是目前主流的通信数据格式,下面就来讲讲如何封装,方便运用。
假设我们在后台操作数据库服务器得到数组数据,对于数组转json只需要json_encode函数就够了,它会自动递归检测,对于数组转xml,就需要严格按照格式来,具体看代码和注释吧。
source code
<?php
/**
* todo:json格式数据通信
* author:entner
* time: 2017-5-8
* version:1.0
* ready:
状态码 :int $code
提示消息:string $message
消息内容:array $data
数组包装:array $result
function:
show 封装多种通信数据格式
jsonencode 封装json格式通信数据
xmltojson 封装xml格式通信数据
xmlencode 递归调用xmltojson
*/
class json{
const json = "json";
/**
*按综合方式输出通信数据
*@param inter code 状态码
*@param char message 消息提示
*@param array data 通信数据
*@param string type 数据类型
*return string
*/
public function show($code,$message,$data=array(),$type = self::json){
/* 检查状态码是否合法 */
if(!is_numeric($code)){
exit();
}
$result = array(
'code'=>$code,
'message'=>$message,
'data'=>$data
);
/* 由客户端传递参数决定封装数据的格式,默认json格式 */
$type = isset($_get['format'])? $_get['format']:self::json;
if($type == 'xml'){
$this->xmlencode($code,$message,$data);
exit; //一次不允许并发多种格式,所以没必要执行下面的判断
}else if($type == 'json'){
$this->jsonencode($code,$message,$data);
exit ;
}else if($type == 'array'){
var_dump($result);
exit;
}else{
// 客户端传来的数据格式为 http/ftp/
}
}
/**
*输出json格式通信数据
*@param inter code 状态码
*@param char message 消息提示
*@param array data 通信数据
*return string
*/
public function jsonencode($code,$message,$data=array()){
if(!is_numeric($code)){
exit();
}
$result = array(
'code'=>$code,
'message'=>$message,
'data'=>$data
);
echo json_encode($result); //json_encode会自动递归转换数组变量
return true;
}
/**
*输出xml格式通信数据
*@param inter code 状态码
*@param char message 消息提示
*@param array data 通信数据
*return string
*/
public function xmlencode($code,$message,$data=array()){
if(!is_numeric($code)){
exit();
}
$result = array(
'code'=>$code,
'message'=>$message,
'data'=>$data
);
/* 拼接xml格式数据 */
/* 这里一定要注意声明头部信息和xml声明 */
header("content-type:text/xml");
$xml = "<?xml version = '1.0' encoding = 'utf-8'?>\n";
$xml .= "<root>\n"; /* xml标签其实也是字符串,所以要用 . 连接运算符 */
$xml .= self::xmltojson($result); /* 调用xmltojson函数解析数组转换为节点 */
$xml .= "</root>";
echo $xml;
}
/**
*递归拼接xml数据
*@param inter code 状态码
*@param char message 消息提示
*@param array data 通信数据
*return string
*/
public static function xmltojson($data){
$xml = $attr = "";
foreach($data as $k => $v){
/*xml不允许出现数字标签,所以要么奖数字转化为字母,要么混合拼接,这里采用很合拼接的方式 */
if(is_numeric($k)){
$attr = " id = '{$k}' ";
$k = "item";
$xml .="<{$k}{$attr}>\n";
/* 因为数组内部可能还存在数组,所以需要自行递归检查一遍,注意,在每次递归的时候,都要连接在$xml尾部,并换行 */
$xml .=is_array($v)?self::xmltojson($v):$v;
$xml .="</{$k}>\n";
}else{
$xml .="<{$k}>\n";
$xml .=is_array($v)?self::xmltojson($v):$v;
$xml .="</{$k}>\n";
}
}
return $xml;
}
}
$data = array(
'name'=>'entner',
'type'=>array(
0=>'a',
1=>'b'
)
);
$try = new json();
$try->xmlencode(200,'success',$data);
总结
以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
参考链接
1、浅谈php与手机app开发即api接口开发
2、c/s b/s 及web工作原理
3、对比分析json及xml
评论列表:
发布于 3天前回复该评论
发布于 3天前回复该评论
发布于 3天前回复该评论
发布于 3天前回复该评论
发布于 2天前回复该评论
发布于 2天前回复该评论
发布于 2天前回复该评论
发布于 2天前回复该评论