json - 如何在 Yii2 上处理 Vue/Axios Json 有效负载发布的数据
问题描述
我花了一段时间才明白这一点,因为它有点明显。我会回答自己,所以其他人可以从答案中受益,当然看看是否有更好的方法来做到这一点。该问题基于 Axios/Yii2,但我想这同样适用于其他向 Yii2 发送数据的前端库/框架。
我需要从 Vuejs 上制作的小表单发布数据,将请求 Axios 发送到 Yii2 上的 Action/Controller,因此数据通过简单的 POST 请求发送,并且帖子正在到达控制器,但我无法接收动作数据,$_POST | $post 为空(使用 xdebug 检查)。
据我所知,这与安全有关。但我已经尝试禁用 public $enableCsrfValidation,所以这不是问题。
public $enableCsrfValidation = false;
但无论如何,Yii2 中的请求/发布数据并没有添加数据。
下图解释了您会在那里发现的问题:
- 发送带有测试数据的帖子的 Axisos 方法。
- Yii2 Action 停在那个地方,应该可以看到数据了。
- 捕获请求的 xdebug 变量和数据。
- 您可以在其中检查有效负载的 Chrome 捕获已发送。
解决方案
答案正如我所说的“有点明显”,但我看不到这一点,我相信其他一些开发人员可能会对此表示赞同。
在疯狂搜索并询问所有人之后,我尝试使用 Postman 应用程序发送请求,是的,我知道测试 api 的最佳方法。
不要忘记添加 xdebug cookie 以便能够调试您的 PHP 端点。
在那里我找到了第一个线索“显而易见的部分”,我没有将数据作为表单数据、Axios 和其他库发送,而是将数据作为原始(应用程序/json)有效负载发送。
这意味着 Yii2 将无法在 post 请求中找到数据,是的,它在那里,但 Yii2 的魔法不起作用,你也不会在 $GLOBALS 或 $_POST 中找到这些数据。
所以阅读 Yii2 文档后,我发现在请求内部我可以使用一个函数来帮助我恢复原始数据,所以要使用以下行:
$raw_data = Yii::$app->request->getRawBody();
现在,该数据以简单的原始 json 字符串形式提供给您,因此请使用 PHP 的强大功能将其解析为对象。
$object= json_decode($raw_data );
最后通过调用您要查找的属性来使用内部数据,并在有效负载上发送:
json有效负载:
{
"msg":"This is my payload",
"id":"11"
}
要使用它:
echo $object->{'msg'}; // prints: This is my payload
所以这就是处理这个问题的方法,现在我想要一些其他的观点,看看是否有更好的方法或更清洁的方法来做到这一点。希望能帮助到你。
推荐阅读
- python - 用子列表和字符串展平列表
- html - Html 使 div 在移动设备上可滚动(空调)
- javascript - React-Native-Offline 队列操作如何为离线优先工作?
- netlogo - 计算标题的加权平均值
- c# - EF Core DBContext 何时处理 Sql Connection?
- javascript - 适用于 Android 的 Chrome 在 5 分钟不活动后冻结标签(chrome v 94)
- python - 关于在特定循环中构造我的数据并保存的最佳方法的问题
- angular - 分布式 Angular UI 架构
- mysql - 如何按 created_at 分组并返回 SQL 中的每日活跃用户率?
- fancybox - Fancybox 4:如何防止关闭按钮关闭*所有*打开的 Fancybox 实例