
在 web 开发中,前端通常通过 post 请求向后端发送数据。常见的 content-type 有 application/x-www-form-urlencoded 和 multipart/form-data。web 服务器(如 apache, nginx)默认会将这两种类型的请求体解析,并将数据填充到 php 的 $_post 全局变量中。因此,yii2 框架默认也是从 $_post 中读取 post 参数。
然而,当前端使用 fetch 或 XMLHttpRequest 发送 Content-Type: application/json 类型的请求时,请求体中的 JSON 数据不会被 Web 服务器自动解析并填充到 $_POST 变量中。这意味着,即使请求成功发送到后端,Yii2 尝试通过 Yii::$app->request->post('paramName') 获取参数时,也会因为 $_POST 为空而得到 null 值。
为了让 Yii2 能够正确解析 application/json 类型的请求体,你需要将 JSON 解析器添加到 yii\web\Request::$parsers 属性中。这通常在你的应用程序配置文件(例如 config/web.php 或 config/main.php)中完成。
在 components 数组中找到 request 组件的配置,并添加 parsers 属性:
// config/web.php 或 config/main.php
'components' => [
'request' => [
// !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
'cookieValidationKey' => 'your-secret-key', // 请替换为你的密钥
'parsers' => [
'application/json' => 'yii\web\JsonParser',
],
// ... 其他请求组件配置
],
// ... 其他组件配置
]通过上述配置,当 Yii2 接收到 Content-Type 为 application/json 的请求时,它会自动使用 yii\web\JsonParser 来解析请求体,并将解析后的数据填充到 Yii::$app->request->post() 方法可访问的内部数据结构中。
前端使用 fetch API 发送 JSON 数据的示例代码如下。请注意 headers 中 Content-Type: application/json 的设置,以及 body 中使用 JSON.stringify() 将 JavaScript 对象转换为 JSON 字符串。
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
30
let csrfToken = document.querySelector("meta[name='csrf-token']").content;
let csrfParam = document.querySelector("meta[name='csrf-param']").content;
// 假设 e.id 和 this.state.ChangeName 是需要发送的数据
const dataToSend = {
'id': e.id,
'name': this.state.ChangeName
};
fetch("http://site.se/react/save-babysitter", {
method: "POST",
headers: {
"Content-Type": "application/json", // 关键:指定内容类型为 JSON
"Accept": "application/json",
// Yii2 CSRF 令牌,确保请求安全
[csrfParam]: csrfToken, // 使用中括号语法,因为 csrfParam 是变量
"X-CSRF-Token": csrfToken // 兼容性考虑,通常 Yii2 会检查其中一个
},
body: JSON.stringify(dataToSend) // 将 JavaScript 对象转换为 JSON 字符串
})
.then(response => {
// 检查响应状态码,如果不是 2xx,则抛出错误
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json(); // 解析 JSON 响应
})
.then((data) => {
console.log("Success:", data);
})
.catch((error) => {
console.error("Error:", error);
});注意事项:
在配置了 JsonParser 之后,Yii2 的 request 组件就能够正确解析 JSON 请求体了。你现在可以通过 Yii::$app->request->post() 方法像获取普通表单数据一样获取 JSON 数据中的参数。
<?php
namespace app\controllers;
use Yii;
use yii\web\Controller;
use yii\web\Response; // 引入 Response 类
class ReactController extends Controller
{
// 禁用 CSRF 验证(仅用于演示,生产环境请谨慎)
// public $enableCsrfValidation = false;
public function actionSaveBabysitter()
{
$request = Yii::$app->request;
// 设置响应格式为 JSON
Yii::$app->response->format = Response::FORMAT_JSON;
// 获取解析后的 JSON 数据
// 如果前端发送的是 {"id": 123, "name": "Test"}
$id = $request->post('id');
$name = $request->post('name');
// 也可以获取所有 POST 参数为一个数组
// $postData = $request->post();
// 生产环境中,通常需要对接收到的数据进行验证和处理
if (empty($id) || empty($name)) {
return [
'status' => 'error',
'message' => 'ID 或 Name 不能为空。',
];
}
// 假设这里进行数据保存或其他业务逻辑
// 例如:$model = new Babysitter(['id' => $id, 'name' => $name]); $model->save();
// 返回成功响应
return [
'status' => 'success',
'message' => '数据接收成功!',
'received_id' => $id,
'received_name' => $name,
// 可以在这里返回更多处理结果
];
}
}重要提示:
通过在 Yii2 应用程序的 request 组件中配置 yii\web\JsonParser,我们可以轻松地解决后端无法接收 application/json 类型 POST 请求数据的问题。这一配置使得 Yii2 能够无缝地处理前端发送的 JSON 数据,极大地简化了前后端数据交互的复杂性。在实际开发中,除了正确配置解析器,还应注意 CSRF 保护、数据验证和规范的错误处理,以构建健壮和安全的 Web 应用程序。
以上就是Yii2 中处理 JSON POST 请求:配置与实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号