如何在Yii2上处理Vue / Axios Json有效负载发布的数据

Pab*_*ios 2 post json yii2 postman vue.js

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

我需要发布来自Vuejs上的一个小表格的数据,将请求Axios发送到Yii2上的Action / Controller,所以数据是通过简单的POST请求发送的,并且该发布到达了控制器,但是我无法接收动作上的数据,$ _ POST | $ post为空(使用xdebug检查)。

据我所知,这与安全性有关。但是我已经通过禁用公共$ enableCsrfValidation进行了尝试,所以这不是问题。

public $enableCsrfValidation = false;
Run Code Online (Sandbox Code Playgroud)

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

下图说明了您将在此处发现的问题:

  1. 发送带有测试数据的Axisos方法。
  2. Yii2行动st脚的地方,我应该能够看到数据。
  3. 捕获请求的xdebug变量和数据。
  4. 您可以在其中检查有效负载的Chrome浏览器的捕获已发送。

在此处输入图片说明

Pab*_*ios 5

答案就像我说的“很明显”,但我看不到,我相信其他一些开发人员也可能会落在这一点上。

在疯狂搜索并询问所有人之后,我尝试使用Postman应用发送请求,是我所知道的测试api的最好的东西。

在此处输入图片说明

不要猜测要添加xdebug cookie来调试您的PHP端点。

在此处输入图片说明

在这里,我找到了第一个线索“显而易见的部分”,我没有将数据作为表单数据,Axios和其他库发送,而是将数据作为原始(应用程序/ json)有效负载发送。

这意味着Yii2将无法在发布请求中找到数据,是的,但是Yii2魔术将无法工作,您也不会在$ GLOBALS或$ _POST中找到该数据。

因此,阅读Yii2文档后,我发现在请求内部,我可以使用一个函数来帮助我恢复Raw数据,因此请使用以下代码行:

$raw_data = Yii::$app->request->getRawBody();
Run Code Online (Sandbox Code Playgroud)

现在,这些数据将以简单的原始json字符串的形式提供给您,因此请使用PHP的功能将其解析为一个对象。

$object= json_decode($raw_data );
Run Code Online (Sandbox Code Playgroud)

最后,通过调用您要查找的属性(在有效载荷上发送)来使用内部数据:

杰森有效载荷:

{
    "msg":"This is my payload",
    "id":"11"
}
Run Code Online (Sandbox Code Playgroud)

要使用它:

echo $object->{'msg'}; // prints: This is my payload
Run Code Online (Sandbox Code Playgroud)

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