ThinkPHP6升级后接口返回异常需四步修复:①修改config/app.php中default_return_type为'json';②统一用return json()或response()->json()替代echo json_encode();③定义api_response()全局函数处理空数组转null及charset;④重写Handler.php中render()方法确保API异常返回JSON。

升级ThinkPHP后接口返回格式突然变成HTML包裹的JSON、空数组不转null、code字段消失或变成status、中文乱码、甚至直接500空白页——这不是前端改了,是TP6+默认行为与TP5.x彻底割裂,必须逐层对齐响应链路。
检查并重置默认返回类型
打开 config/app.php,找到 【'default_return_type' => 'html'】 这一行。TP6默认值是html,不是json,所有没显式调用json()的接口都会被推导为HTML响应。把它改成'default_return_type' => 'json'。
这一步必须做,否则后续所有return $data都会走HTML模板渲染逻辑,哪怕你写了header('Content-Type: application/json')也无效——框架在输出前已按default_return_type封装成Response对象。
统一替换控制器中的返回写法
把所有类似return ['code'=>0,'data'=>$user];或echo json_encode([...]);的写法全部删掉。
立即学习“PHP免费学习笔记(深入)”;
方法一:显式调用json()并强制头信息
直接写:return json(['code'=>0,'msg'=>'success','data'=>$user])->header('Content-Type','application/json; charset=utf-8');
注意:charset=utf-8不能省,否则中文字段在部分Android WebView里会显示为\u4f60\u597d。
方法二:用TP6.3+新增的response()->json()return response()->json(['code'=>0,'msg'=>'success','data'=>$user]);
这个更安全,自动带charset=utf-8且可链式追加->withCookie(...)等操作。
⚠️关键提醒:绝对不要混用 echo json_encode() 和 return json() —— 前者绕过框架响应生命周期,中间件、日志、异常捕获全失效,且极易触发Headers already sent错误。
重构全局响应函数(推荐)
第一步:在app/common.php中定义标准函数
function api_response($code = 0, $msg = 'success', $data = null) {<br>
return json([<br>
'code' => (int)$code,<br>
'msg' => (string)$msg,<br>
'data' => $data === [] ? null : $data,<br>
'timestamp' => time(),<br>
])->header('Content-Type', 'application/json; charset=utf-8');<br>
}
第二步:在所有控制器中替换原返回逻辑
① 找到所有return [...]语句
② 替换为return api_response(0, 'success', $data);或return api_response(400, '参数错误', []);
③ 空数组[]会自动转为null,避免前端解析时误判为“有数据”
第三步:检查是否加载了common.php
确认app/provider.php中'think\helper\Loader'已注册,或在入口文件public/index.php顶部手动require APP_PATH . 'common.php';。
修复异常响应被转成HTML的问题
打开 app/exception/Handler.php,定位到render()方法。
把原来的return parent::render($request, $e);替换成:
if ($request->isAjax() || $request->expectsJson() || $request->path() === 'api' || strpos($request->path(), 'api/') === 0) {<br>
return response()->json([<br>
'code' => 500,<br>
'msg' => '服务器内部错误',<br>
'data' => null,<br>
], 500);<br>
}<br>
return parent::render($request, $e);
这确保所有以api/开头的路由出错时,强制返回标准JSON结构,而不是带堆栈的HTML页面。



















