2

谢谢大家的收藏与赞,这是对我最大的鼓励。

必要性

不管在B/S架构中,还是C/S架构中,两端的数据通信(注:这里的通信是指的网络请求和回复操作)都无可避免,因为没有数据便没有内容,没有内容,又有什么意义 :)
一般来说C/S架构通信执行流程如下:

823310-20160506195930997-2001021521.jpg

而B/S架构通信执行流程像这样:

823310-20160506195943935-1237461310.jpg

选择

既然数据通信,不可避免,那应该选择哪种通信方式比较好呢?目前来看服务器与客户端进行数据传输与交互的方式主要有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);

参考链接

浅谈PHP与手机APP开发即API接口开发
C/S B/S 及WEB工作原理
对比分析json及XML

结语

这几天在搬宿舍,刚忙完,第一时间就来了,哈哈。
还是那句老话,欢迎各位留言和评论。


entner
751 声望187 粉丝

青年 ---------------