首页 > 解决方案 > 如何在 Yii2 上处理 Vue/Axios Json 有效负载发布的数据

问题描述

我花了一段时间才明白这一点,因为它有点明显。我会回答自己,所以其他人可以从答案中受益,当然看看是否有更好的方法来做到这一点。该问题基于 Axios/Yii2,但我想这同样适用于其他向 Yii2 发送数据的前端库/框架。

我需要从 Vuejs 上制作的小表单发布数据,将请求 Axios 发送到 Yii2 上的 Action/Controller,因此数据通过简单的 POST 请求发送,并且帖子正在到达控制器,但我无法接收动作数据,$_POST | $post 为空(使用 xdebug 检查)。

据我所知,这与安全有关。但我已经尝试禁用 public $enableCsrfValidation,所以这不是问题。

public $enableCsrfValidation = false;

但无论如何,Yii2 中的请求/发布数据并没有添加数据。

下图解释了您会在那里发现的问题:

  1. 发送带有测试数据的帖子的 Axisos 方法。
  2. Yii2 Action 停在那个地方,应该可以看到数据了。
  3. 捕获请求的 xdebug 变量和数据。
  4. 您可以在其中检查有效负载的 Chrome 捕获已发送。

在此处输入图像描述

标签: jsonpostvue.jsyii2postman

解决方案


答案正如我所说的“有点明显”,但我看不到这一点,我相信其他一些开发人员可能会对此表示赞同。

在疯狂搜索并询问所有人之后,我尝试使用 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

所以这就是处理这个问题的方法,现在我想要一些其他的观点,看看是否有更好的方法或更清洁的方法来做到这一点。希望能帮助到你。


推荐阅读