谢谢你们的收藏与赞,这是对我最大的鼓励。php
无论在B/S架构中,仍是C/S架构中,两端的数据通讯(注:这里的通讯是指的网络请求和回复操做)都无可避免,由于没有数据便没有内容,没有内容,又有什么意义 :)
通常来讲C/S架构通讯执行流程以下:html
而B/S架构通讯执行流程像这样:数据库
既然数据通讯,不可避免,那应该选择哪一种通讯方式比较好呢?目前来看服务器与客户端进行数据传输与交互的方式主要有URL、XML、JSON三种方式。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,就须要严格按照格式来,具体看代码和注释吧。架构
<?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);
浅谈PHP与手机APP开发即API接口开发
C/S B/S 及WEB工做原理
对比分析json及XML并发
这几天在搬宿舍,刚忙完,第一时间就来了,哈哈。
仍是那句老话,欢迎各位留言和评论。函数