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内部的请求/发布数据中。
下图说明了您将在此处发现的问题:
答案就像我说的“很明显”,但我看不到,我相信其他一些开发人员也可能会落在这一点上。
在疯狂搜索并询问所有人之后,我尝试使用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)
因此,这就是处理该问题的方法,现在我想以其他一些观点来看,是否有更好的方法或更清洁的方法可以做到这一点。希望能帮助到你。