中间件中必须用 $request->json() 读取 json 数据,且 content-type 必须严格为 application/json;tp6.1+ 可用 $request->withjson(true) 统一接管 input(),但需确保在依赖数据的中间件前调用;validate() 不自动识别 json,须显式传入 $request->json() 结果。

中间件里直接调用 $request->json() 就能读 JSON,但必须先确保 Content-Type 正确
前端发 application/json 请求时,$request->input() 一定为空——这不是你漏写了逻辑,是 ThinkPHP 默认不解析 JSON 请求体。中间件中要取数据,唯一可靠方式是显式调用 $request->json()。
常见错误现象:$request->json('user.id') 返回 null,但 $request->getInputData() 能看到原始字符串;或 $request->json()(无参)返回空数组——大概率是 Content-Type 不严格匹配。
-
Content-Type必须是application/json,不能带空格或参数,例如application/json; charset=utf-8在 TP6.0 某些版本会失败 -
$request->json()内部已缓存解析结果,多次调用不重复解析,安全高效 - JSON 格式错误时,
$request->json()静默返回null,务必加判断:if (null === $request->json()) { /* 记录日志 + 返回 400 */ }
TP6.1+ 可用 $request->withJson(true) 统一接管后续所有 input(),但中间件注册顺序有坑
TP6.1 引入了 $request->withJson(true),调用后会让后续的 $request->input()、$request->param() 等方法自动从已解析的 JSON 中取值。但它不是“全局开关”,只对当前 $request 实例生效,且依赖中间件执行顺序。
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
- 必须在权限/签名等依赖请求数据的中间件之前调用,比如放在
CheckAuth或自定义ParseJson中间件里 - 如果在控制器里才调用,那前面的中间件已经走完,
input()仍为空 - TP6.0 不支持该方法,强行调用会报错,需降级为
$request->json(true)并手动传参
验证 JSON 数据别用 validate() 自动推导,得把 $request->json() 结果显式传进去
ThinkPHP 的 $this->validate($data, $rule) 默认只查 $_POST 和 $_GET,完全忽略 JSON。即使你已在中间件调用过 withJson(true),validate() 也不会自动切换数据源。
- 正确做法:在中间件或控制器中先拿到
$data = $request->json() ?: [],再传给验证器:Validate::make($rules, $data)->batch()->check() - 别混传:
array_merge($request->json(), $request->post())是危险操作,JSON 请求下$request->post()为空数组,但可能掩盖字段缺失问题 - 自定义规则里禁止用
input('xxx')取值——它仍查$_POST,应通过with(['raw' => $data])注入并显式使用
中间件返回 JSON 响应时,别被 ViewInit 拦截,也别漏掉 return
中间件里想直接返回 JSON 错误(比如签名失败、字段缺失),用 json($data) 不会自动输出,更不会带 Content-Type: application/json 头——因为默认响应通道被模板中间件劫持了。
- 必须显式
return json($data)->header(['Content-Type' => 'application/json']),且确保该中间件在ViewInit之前执行 - 路由定义中可统一禁用:
->withoutMiddleware(\think\middleware\ViewInit::class) - 漏写
return是高频失误:中间件里只调用json()而不 return,流程会继续往下走,最终可能进控制器或 404
真正卡住人的地方,往往不是 JSON 解析本身,而是中间件链中「谁先做」「谁依赖谁」——比如 withJson(true) 必须在 CheckPermission 前,而 CheckPermission 又必须在 CheckAuth 后,顺序错一环,$request->json() 就永远拿不到数据。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










