php接口返回统一json格式,关键在于结构一致、状态真实、错误可控:必须设置content-type头、杜绝杂输出、校验json_encode()结果、拦截异常与致命错误,并联动http状态码与业务code。

PHP接口返回统一JSON格式,关键在于结构一致、状态真实、错误可控。不能只靠json_encode()完事,必须从响应头、编码安全、异常拦截、HTTP状态码四个层面协同控制。
设置正确响应头并杜绝杂输出
任何非JSON内容(空格、警告、HTML、BOM)都会让前端JSON.parse()失败。务必做到:
- 开头就调用
header('Content-Type: application/json; charset=utf-8'),且不能有任何输出在它之前 - 禁用PHP错误直接输出:
ini_set('display_errors', '0');开发环境可开,但生产必须关 - 确保文件保存为UTF-8无BOM格式(尤其Windows编辑器易带BOM)
- 所有
echo/print都应被json_encode()替代,结尾加exit;防后续代码意外输出
json_encode()必须做失败检查
json_encode()失败时返回false,不是抛异常,不检查就会返回空或null,前端无法识别是数据为空还是编码炸了:
- 始终用
=== false严格判断:$json = json_encode($data); if ($json === false) { /* 处理错误 */ } - 配合
json_last_error()和json_last_error_msg()定位原因:循环引用、资源类型、中文编码混杂等 - 对不确定数据预处理:用
mb_convert_encoding($data, 'UTF-8', 'UTF-8')过滤编码;用JSON_UNESCAPED_UNICODE保留中文可读性 - PHP 7.3+ 可启用
JSON_THROW_ON_ERROR,让失败直接抛JsonException,便于try-catch统一捕获
全局异常与致命错误统一转JSON
未捕获的Exception或Error(如ParseError、FatalError)默认会输出原始PHP错误,破坏JSON结构。需注册双层拦截:
- 用
set_exception_handler()捕获所有未被捕获的Exception和Error(因Error也实现了Throwable) - 用
register_shutdown_function()兜底捕获fatal error(如内存耗尽、语法错误),再通过error_get_last()判断是否为致命错误 - 两类处理器都应:设置
4xx/5xx状态码、输出标准JSON错误体(如{"code":500,"message":"Internal Server Error"})、记录日志、屏蔽敏感信息(如堆栈在生产环境不返回)
统一响应结构 + 状态码联动
前端靠response.status和response.data.code双重判断成败,二者必须一致:
- 定义最小字段集:
code(业务码,如200/400/500)、message(用户提示)、data(成功时的数据主体,失败时为null或省略) - HTTP状态码必须真实反映结果:成功用
200,参数错用400,未授权用401,服务异常用500——绝不能所有情况都返回200 OK再靠code区分 - 封装一个
Response::json($data, $code = 200, $httpCode = 200)工具方法,自动设头、编码、状态码,避免重复逻辑 - 在框架中(如ThinkPHP/Laravel)优先使用其异常处理器机制,继承并重写
render()方法,保持与路由、中间件生命周期一致
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











