1. 程式人生 > >PHP 開發 APP 介面 --JSON、XML結合篇

PHP 開發 APP 介面 --JSON、XML結合篇

要求:

1.在一個類中封裝多種資料通訊方法(JSON,XML),並且只通過一個入口選擇需要的資料通訊格式

2.客戶端開發工程師可以自行選擇資料傳輸格式(GET 方式)

response.php

複製程式碼
<?php

class Response{
    const JSON = 'json';
    //封裝的綜合方法,預設的資料型別為json
    public static function show($code,$message = '',$data,$type = self::JSON){
        
        if(!is_numeric($code)){
            return '';
        }
        //供測試陣列使用
        $result = array(
            'code' => $code,
            'message' => $message,
            'data' => $data
        );
        //通過get引數判斷通訊資料型別
        $typelist = array('json','xml','array'); // array為測試使用
        if(isset($_GET['type'])){
            if(in_array(strtolower($_GET['type']),$typelist)){
                $type = strtolower($_GET['type']);
            }else{
                $type = self::JSON;
            }
        }else{
            $type = self::JSON;
        }

        if($type == 'json'){
            self::json($code,$message = '',$data);
        }else if($type == 'xml'){
            self::xml($code,$message = '',$data);
        }else if($type == 'array'){
            var_dump($result);    //僅供測試
        }
    }

    /**
    * 按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
        );

        echo json_encode($result);
        exit();
    }

    /**
    * 按 xml 方式輸出通訊資料
    * @param integer $code 狀態碼
    * @param string $message 提示資訊
    * @param array $data 資料
    * return string
    */
    public static function xml($code,$message,$data){

        if(!is_numeric($code)){
            return '';
        }

        $result = array(
            'code' => $code,
            'message' => $message,
            'data' => $data
        );

        //修改 http 頭資訊
        header("Content-Type:text/xml");
        //xml頭資訊
        $xml = "<?xml version='1.0' encoding='utf-8'?>";
        //根節點開始標籤
        $xml .= "<root>";

        $xml .= self::xmlToEncode($result);

        //根節點結束標籤
        $xml .= "</root>";

        echo $xml;
        exit();
    }

    //解析$result至xml
    public static function xmlToEncode($data){
        $xml = $attr = "";
        foreach($data as $k=>$v){
            //如果$k是數字(data(code,message,data中的data)資料裡面還含有索引陣列),要進行如下判斷
            if(is_numeric($k)){
                $attr = "id='{$k}'";
                $k = 'item ';
            }

            $xml .= "<{$k}{$attr}>";
            //如果$v是陣列,則遞迴呼叫該方法
            if(is_array($v)){
                $xml .= self::xmlToEncode($v);
            }else{
                $xml .= $v;
            }
            $xml .= "</{$k}>";
        }

        return $xml;
    }
}
複製程式碼

test.php

複製程式碼
<?php
require 'response.php';

$data = array(
    'id'=>1,
    'name'=>'Mary',
    'type'=>array(1,3,6) 
);

Response::show(200,'資料返回成功',$data);
複製程式碼

測試url:

http://127.0.0.17/php/APP/test.php

http://127.0.0.17/php/APP/test.php?type=json

http://127.0.0.17/php/APP/test.php?type=xml

http://127.0.0.17/php/APP/test.php?type=array

http://127.0.0.17/php/APP/test.php?type=XML (返回 xml 資料)

http://127.0.0.17/php/APP/test.php?type=arr (返回 json 資料)