Yii2默认不解析application/json请求体,需在config/web.php中配置request组件的parsers属性添加'application/json'=>'yii\web\JsonParser',配置后post()和getBodyParams()方可正常获取JSON数据。

Yii2 表单用 AJAX 提交时拿不到 JSON 数据,核心问题不是前端没发对,而是 Yii2 默认不解析 application/json 类型的请求体——它只处理表单编码(application/x-www-form-urlencoded)和文件上传(multipart/form-data)两种格式。即使你用 fetch 或 axios 正确设置了 Content-Type: application/json,Yii::$app->request->post() 和 getBodyParams() 依然为空。
确认请求类型是否为 application/json
先看浏览器 Network 面板里该请求的 Headers → Request Headers → Content-Type。如果是 application/json(或带 charset 如 application/json;charset=UTF-8),那就必须走 JSON 解析流程;如果是 application/x-www-form-urlencoded,则说明前端实际发的是表单数据,此时应检查 JS 是否误用了 JSON.stringify() 却没改 Content-Type,或是否用了 FormData 但没设 processData: false 和 contentType: false。
后端必须配置 JsonParser
在 config/web.php 的 'components' => ['request' => [...]] 中添加解析器配置:
- 找到
'request' => [这一段 - 在里面加入
'parsers' => ['application/json' => 'yii\web\JsonParser'] - 如果前端偶尔发
text/json,可额外加'text/json' => 'yii\web\JsonParser' - 注意保留原有
'cookieValidationKey',否则 CSRF 会报错
配置生效后,Yii::$app->request->post() 和 getBodyParams() 就能直接读取 JSON 字段了。
AJAX 提交时别漏掉 CSRF 令牌
Yii2 默认开启 CSRF 验证,纯 JSON 请求也会校验。前端需在请求头或请求体中带上:
- 推荐方式:在
headers中加X-CSRF-Token,值取自页面 meta 标签:document.querySelector('meta[name="csrf-token"]').content - 备选方式:把
_csrf作为 JSON 字段一起发送,如{ "name": "xxx", "_csrf": "xxx" } - 若临时关闭验证(仅限调试),在控制器中设
public $enableCsrfValidation = false;,但上线前务必恢复
验证失败返回 JSON 要保持格式统一
常见错误是:AJAX 设置了 dataType: 'json',但后端在验证不通过时直接 echo 'error' 或跳转,导致客户端收到非 JSON 内容而报 parsererror。
- 所有响应路径(包括成功、失败、无数据)都必须返回合法 JSON 字符串
- 控制器动作末尾统一用
return ['code' => 0, 'message' => 'ok', 'data' => $result];,Yii2 会自动设Content-Type: application/json并序列化 - 避免在任意位置用
echo、die()、exit(),它们会破坏响应结构


















