最方便的方式是封装全局响应函数并配合自动header设置和环境判断。需固定code、message、data字段,支持默认值,自动过滤空数组为null,显式设置Content-Type为application/json且带charset=utf-8,结合基类或中间件统一注入,参数校验、权限、数据库异常等均按约定code返回,确保前后端响应结构一致。

最方便的方式是封装一个全局响应函数,并配合自动 header 设置和环境判断,避免每个接口重复写结构、漏设类型、误传数据。
封装统一响应函数
在公共文件(如 common.php 或框架的助手函数中)定义一个简洁、可复用的返回函数:
- 固定字段:
code、message、data,不随意增减或改名 - 支持默认值:成功时
code=0、message="success",失败时可快速覆盖 - 自动过滤空数组:当
$data是空数组但业务上应表示“无数据”,建议传null而非[] - 示例:
function api_response($code = 0, $message = 'success', $data = null) {
header('Content-Type: application/json; charset=utf-8');
return json_encode([
'code' => (int)$code,
'message' => (string)$message,
'data' => $data,
'timestamp' => time(),
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}
?>
确保 Content-Type 正确且及时
HTTP 头必须在任何输出前设置,否则会报 “Headers already sent” 错误:
- 不要依赖框架默认行为,显式调用
header() - 必须带
charset=utf-8,否则中文变或乱码 - 不能用
text/plain或application/javascript冒充 JSON —— Axios/fetch 会直接拒绝解析 - 开发时可用
headers_sent()做简单校验(上线后建议移除)
结合基类或中间件自动注入(推荐用于项目级)
如果用 ThinkPHP、Laravel 或自建 BaseController,可在构造或前置方法中统一处理:
立即学习“PHP免费学习笔记(深入)”;
- 所有控制器继承同一个基类,基类提供
success()和error()方法 - 拦截异常,用自定义 Handler 统一转为标准格式(如 404 →
code=40400) - 生产环境关闭
display_errors,禁用调试信息(如debug_backtrace) - 避免在响应里输出 PHP 错误、SQL 报错、路径等敏感内容
参数与错误也走同一套结构
不只是成功要统一,失败响应更要一致:
- 参数校验失败时,返回
code=42200,message明确指出哪个字段错(如 “email 格式不正确”) - 权限不足返回
code=40300,而不是 HTTP 403 + 空 body - 数据库异常统一转为
code=50002,不暴露原始错误 - 前端只需判断
code === 0即可决定是否渲染data,无需再猜字段名或状态逻辑



















