API 開發中,統一回傳格式(狀態碼、訊息、資料)並支援多種輸出格式(JSON、XML、JSONP、Array)是基礎需求。本文實作 DataReturn 類別,封裝格式標準化、編碼轉換、回調函數支援,極簡調用即可產出規範回應。
retcode(狀態碼)、msg(訊息)、data(資料)。<?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 .= "$root>";
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 .= "$key>\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();
{"status":1000,"info":"success","result":{"id":"100","name":"fdipzone","gender":1,"age":28}}
handleResponse({"status":1000,"info":"success","result":{"id":"100","name":"fdipzone","gender":1,"age":28}});
1000
success
100
fdipzone
1
28
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();
}
DataReturn 以單一類別解決 API 格式標準化與多格式輸出問題,配合參數化欄位名稱,能快速適配不同前端框架(Vue/React/Angular/jQuery)的介面約定,是 RESTful API 開發的基礎建設利器。