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

时间:2018-06-13 13:49:08

标签: json post vue.js yii2 postman

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

我需要从Vuejs上的小表单发布数据,将请求Axios发送到Yii2上的Action / Controller,因此数据是通过一个简单的POST请求发送的,并且帖子已经到达控制器,但我不是能够接收有关动作的数据,$ _POST | $ post到空(使用xdebug检查)。

我记得,这与安全性有关。但我已经尝试通过禁用公共$ enableCsrfValidation,因此这不是问题。

public $enableCsrfValidation = false;

但无论怎样,数据都没有被添加到Yii2内的请求/发布数据中。

以下图片解释了您将在那里找到的问题:

  1. 使用测试数据发送帖子的Axisos方法。
  2. Yii2 Action在这个地方停了下来,我应该能够看到数据。
  3. 捕获请求的xdebug变量和数据。
  4. 可以检查有效负载的Chrome捕获信息。
  5. enter image description here

1 个答案:

答案 0 :(得分:4)

答案就像我说的那样“显而易见”,但我看不出来,而且我相信其他一些开发者可能会落在这上面。

在疯狂搜索并询问每个人之后,我尝试使用Postman应用程序发送请求,我知道测试apis的最佳方法。

enter image description here

不要因为添加xdebug cookie而能够调试PHP端点。

enter image description here

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

这意味着Yii2将无法在发布请求中找到数据,是的,但是Yii2 magic不起作用,你也不会在$ GLOBALS或$ _POST中找到这些数据。

因此,阅读Yii2文档,我发现内部请求我可以使用一个函数来帮助我恢复原始数据,所以要使用以下行:

$raw_data = Yii::$app->request->getRawBody();

现在,这些数据作为一个简单的原始json字符串传递给你,所以使用PHP的强大功能将它解析为一个对象。

$object= json_decode($raw_data );

最后通过调用您要查找的属性来使用内部数据,在付费负载上发送:

Json Payload:

{
    "msg":"This is my payload",
    "id":"11"
}

使用它:

echo $object->{'msg'}; // prints: This is my payload

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