当 laravel 接收 json 请求时,`$request->all()` 返回空数组,通常是因为未正确设置请求头、未启用 json 输入解析,或混淆了 `php://input` 与 laravel 的请求对象行为。本文详解根本原因并提供可落地的修复方案。
在 Laravel 中,$request->all() 无法获取 JSON 请求体数据,并非 Bug,而是由底层请求解析机制决定的。Laravel 默认仅在 Content-Type: application/x-www-form-urlencoded 或 multipart/form-data 时自动解析并填充 $request->all();而对 application/json 请求,必须显式启用 JSON 输入解析支持——这依赖于两个关键前提:
? 验证方式:在控制器中添加 dd($request->header('content-type'), $request->json()->all());,确认 header 值与 JSON 解析结果。
public function feedback(Request $request)
{
// ✅ 推荐:使用 json() 方法(Laravel v5.5+)
$data = $request->json()->all(); // 返回完整关联数组
// ✅ 或按需取值(更安全,支持嵌套)
$message = $request->input('message'); // 自动兼容 form/json
$specs = $request->input('specs', 'N/A'); // 支持默认值
// ✅ 强验证(推荐生产环境)
$validated = $request->validate([
'message' => 'required|string|min:5',
'specs' => 'nullable|string',
]);
dd($data, $message, $validated);
}⚠️ 注意:$request->input() 是最佳通用方法,它内部自动适配 x-www-form-urlencoded、JSON 和 query string,无需区分来源;而 $request->all() 在纯 JSON 场景下可能为空(尤其在早期 Laravel 版本或自定义中间件干扰时)。
通过以上配置与编码习惯,即可彻底解决 Laravel JSON 请求输入为空的问题,确保 API 稳健可靠。