thinkphp 6 已移除 rawinput(),应改用 getcontent() 读取原始请求体;该方法等价于 file_get_contents('php://input'),但只能调用一次,重复调用返回空字符串。

ThinkPHP 6 的 rawInput() 已被移除,别再找它了
ThinkPHP 6 不再提供 rawInput() 方法——这个方法在 TP5.1 中存在,但 TP6 彻底删掉了。如果你在 TP6 里调用 $request->rawInput(),会直接报错:Call to undefined method think\Request::rawInput()。这不是你配置错了,是框架本身没这个函数。
TP6 正确读取原始请求体:用 getContent() + 注意编码和重复读取问题
getContent() 是 TP6 官方推荐的替代方案,它等价于原生 file_get_contents('php://input'),能拿到未解析的原始请求体(比如 JSON、XML、纯文本或二进制数据)。
- 必须在控制器/中间件中通过
$this->request或注入think\Request实例调用,不能在模型或非请求上下文中硬写 - 原始体只能读一次:PHP 的
php://input流是只读且不可重放的,调用过一次getContent()后再调用会返回空字符串 - 如果前端发的是 JSON 但没带
Content-Type: application/json,getContent()仍能读到内容,但$request->param()就不会自动解析——这点常被忽略 - 示例:
$raw = $this->request->getContent(); // 返回 string,可能为空 if (empty($raw)) { throw new HttpException(400, 'Empty request body'); } $data = json_decode($raw, true); if (json_last_error() !== JSON_ERROR_NONE) { throw new HttpException(400, 'Invalid JSON'); }
为什么有时候 getContent() 返回空?检查这三件事
空返回不是 bug,大概率是环境或调用时机问题。
- Apache 下启用了
mod_rewrite但没配AllowOverride All,导致php://input被截断——改用 Nginx 或检查 Apache 配置 - 请求方法不是
POST/PUT/PATCH/DELETE,例如用GET发送 body,PHP 默认不处理,getContent()必然为空 - 在中间件里提前调用了
$request->param()或$request->post()——这些方法内部会主动读取一次php://input,后续再调getContent()就拿不到内容了;解决办法是统一用getContent()解析,避免混用
TP5.1 迁移到 TP6?别硬套旧写法
TP5.1 的 rawInput() 是对 file_get_contents('php://input') 的简单封装,而 TP6 把底层逻辑收得更紧,强制你直面原始流语义。迁移时最稳妥的做法是:
- 把所有
$request->rawInput()替换为$request->getContent() - 删掉任何对
$request->post()和$request->param()的前置调用(尤其在中间件中) - 如果项目依赖自动 JSON 解析,建议统一在基础控制器里加一个
getRawJson()方法封装校验逻辑,而不是散落在各处
原始请求体这东西,看着简单,实际卡在环境、顺序、协议细节上最多。盯住 getContent() 的单次性,比什么都重要。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











