首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 統一資料回傳格式類別:支援 JSON、XML、JSONP、Array 多格式輸出

     編輯:PHP 相關知識

API 開發中,統一回傳格式(狀態碼、訊息、資料)並支援多種輸出格式(JSON、XML、JSONP、Array)是基礎需求。本文實作 DataReturn 類別,封裝格式標準化、編碼轉換、回調函數支援,極簡調用即可產出規範回應。

設計目標

  • 統一回傳結構:retcode(狀態碼)、msg(訊息)、data(資料)。
  • 支援欄位名稱自訂(對接不同前端約定)。
  • 一鍵切換輸出格式:JSON、XML、JSONP(Callback)、Array(除錯)。
  • 自動設定正確 Content-Type 標頭。
  • XML 支援 CDATA 區塊自動判斷。

類別程式碼

<?php
class DataReturn {
    private $type;
    private $xmlroot;
    private $callback;
    private $returnData;

    public function __construct(array $param = []) {
        $this->type = isset($param['type']) ? strtoupper($param['type']) : 'JSON';
        $this->xmlroot = isset($param['xmlroot']) ? $param['xmlroot'] : 'xmlroot';
        $this->callback = isset($param['callback']) ? $param['callback'] : '';

        $format = [
            'retcode' => isset($param['format']['retcode']) ? $param['format']['retcode'] : 'retcode',
            'msg'     => isset($param['format']['msg'])     ? $param['format']['msg']     : 'msg',
            'data'    => isset($param['format']['data'])    ? $param['format']['data']    : 'data',
        ];

        $this->returnData = [
            $format['retcode'] => isset($param['retcode']) ? $param['retcode'] : 0,
            $format['msg']     => isset($param['msg'])     ? $param['msg']     : '',
            $format['data']    => isset($param['data'])    ? $param['data']    : '',
        ];
    }

    public function data_return() {
        ob_clean();
        switch ($this->type) {
            case 'JSON':      $this->json_return();      break;
            case 'XML':       $this->xml_return();       break;
            case 'CALLBACK':  $this->callback_return();  break;
            case 'ARRAY':     $this->array_return();     break;
            default:          $this->json_return();
        }
        exit();
    }

    private function json_return() {
        header('Content-Type: application/json; charset=utf-8');
        if (empty($this->callback)) {
            echo json_encode($this->returnData);
        } else {
            echo $this->callback . '(' . json_encode($this->returnData) . ');';
        }
    }

    private function xml_return() {
        header('Content-Type: text/xml; charset=utf-8');
        echo $this->xml_encode($this->returnData, $this->xmlroot);
    }

    private function callback_return() {
        header('Content-Type: text/html; charset=utf-8');
        $cb = empty($this->callback) ? 'callback' : $this->callback;
        echo "";
    }

    private function array_return() {
        header('Content-Type: text/html; charset=utf-8');
        echo '
';
        print_r($this->returnData);
        echo '
'; } private function xml_encode($data, $root = 'xmlroot', $encoding = 'utf-8') { $xml = "\n"; $xml .= "<$root>\n"; $xml .= $this->data_to_xml($data); $xml .= ""; return $xml; } private function data_to_xml($data) { if (is_object($data)) $data = get_object_vars($data); $xml = ''; foreach ($data as $key => $val) { if (is_numeric($key)) $key = "item id=\"$key\""; $xml .= "<$key>"; $xml .= (is_array($val) || is_object($val)) ? $this->data_to_xml($val) : $this->cdata($val); list($key) = explode(' ', $key); $xml .= "\n"; } return $xml; } private function cdata($val) { if (!empty($val) && !preg_match('/^[A-Za-z0-9+$]/', $val)) { return ''; } return $val; } } ?>

使用範例

<?php
require 'DataReturn.class.php';

$param = [
    'type'     => 'JSON',           // JSON, XML, CALLBACK, ARRAY
    'retcode'  => 1000,
    'msg'      => 'success',
    'data'     => [
        'id'     => '100',
        'name'   => 'fdipzone',
        'gender' => 1,
        'age'    => 28,
    ],
    'format'   => [                 // 自訂欄位名稱
        'retcode' => 'status',
        'msg'     => 'info',
        'data'    => 'result',
    ],
    'xmlroot'  => 'response',       // XML 根節點
    'callback' => 'handleResponse'  // JSONP 回調函數名
];

$api = new DataReturn($param);
$api->data_return();

各格式輸出範例

JSON (預設)

{"status":1000,"info":"success","result":{"id":"100","name":"fdipzone","gender":1,"age":28}}

JSONP (含 callback)

handleResponse({"status":1000,"info":"success","result":{"id":"100","name":"fdipzone","gender":1,"age":28}});

XML



1000
success

100
fdipzone
1
28

Array (除錯用)

Array
(
    [status] => 1000
    [info] => success
    [result] => Array
        (
            [id] => 100
            [name] => fdipzone
            [gender] => 1
            [age] => 28
        )
)

進階應用:中介軟體整合

<?php
// 統一 API 回應中介軟體 (Slim/Laravel/ThinkPHP 風格)
function api_response($data = [], $code = 200, $msg = '', $format = 'json') {
    $param = [
        'type'    => strtoupper($format),
        'retcode' => $code,
        'msg'     => $msg,
        'data'    => $data,
    ];
    $api = new DataReturn($param);
    // 不直接 exit,改為返回字串供框架處理
    ob_start();
    $api->data_return(); // 內部會 exit,實際整合需修改 data_return 返回字串
    return ob_get_clean();
}

最佳實務建議

  • 錯誤碼規範:定義常數狀態碼(如 `ERR_VALIDATION=4001`, `ERR_UNAUTH=401`),避免魔術數字。
  • 資料結構一致性:`data` 欄位統一為物件/陣列,避免純量值導致前端解析分支。
  • XML CDATA 判斷:目前邏輯為「非純英數字元則包 CDATA」,可依實際需求調整(如含 HTML 標籤必須 CDATA)。
  • 移除 exit():框架整合時建議將 `data_return()` 改為 `getOutput()` 返回字串,由框架統一輸出。
  • CORS 支援:API 入口統一加入 `Access-Control-Allow-Origin` 標頭。

DataReturn 以單一類別解決 API 格式標準化與多格式輸出問題,配合參數化欄位名稱,能快速適配不同前端框架(Vue/React/Angular/jQuery)的介面約定,是 RESTful API 開發的基礎建設利器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved