ThinkPHP5.0开发JSON接口需避开模板渲染、路由混淆和响应头干扰三类问题;关键措施包括隔离API路由、控制器统一return json()、禁用ViewInit中间件、配置全局JSON返回及处理跨域与参数解析。

ThinkPHP5.0开发JSON接口不难,关键在于避开模板渲染、路由混淆和响应头干扰这三类典型问题。只要把路由隔离清楚、控制器统一用json()返回、禁用视图中间件,10分钟内就能跑通一个可用的纯API接口。
路由必须明确区分前后端
默认路由容易把/api/user当成前端页面路径,导致404。务必做两件事:
- 关闭强制路由:在
config/route.php中设'url_route_must' => false - 用域名或前缀隔离API:比如
Route::domain('api', function () { Route::group('v1', ['app\api\controller\User']); }); - 非API请求全部fallback到前端入口:
Route::rule('[:path]', 'index/index')->ext('html');,加->ext('html')可避免误匹配.json后缀请求
控制器只返回JSON,不走模板
哪怕写了json($data),如果没禁用ViewInit中间件,仍可能被渲染成HTML页面。
- 每个接口方法末尾必须写
return json(['code' => 200, 'data' => $result]);,不能只调用json()不加return - 在路由定义中排除视图中间件:
->withoutMiddleware(\think\middleware\ViewInit::class) - 如需中文不转义,传入选项:
return json($data, 200, [], JSON_UNESCAPED_UNICODE);
全局配置让API更省心
适合整站都是API的项目,一劳永逸:
立即学习“PHP免费学习笔记(深入)”;
- 修改
config/app.php中的default_return_type为'json' - 确认
view_init中间件已从应用中间件队列中移除(检查app/middleware.php) - 异常也需JSON化:在
app/exception.php中统一返回json(['code' => 500, 'msg' => $e->getMessage()])
跨域和参数获取要顺手
前端调用常卡在跨域和取不到POST JSON体上:
- 安装
think-cors包并按文档启用,比手动加header更稳定 - GET/POST/路由参数统一用
$this->request->param()获取,它自动合并三者,无需再判$_GET或$_POST - 若前端发的是
Content-Type: application/json,param()默认能正确解析,无需额外处理



















