场景:

  最近在搭建PHP服务的时候,遇到一个问题,选用框架是YII,通过POSTMAN提交数据,提交方式选择POST

  ,其中Body主要有以下三个选项

  1、form-data

  2、x-www-form-urlencoded

  3、raw

  当选择1、form-data时,提交能正常接收到POST数据,但是选择raw+JSON(application/json)时,POST接收数据为空,

  PHP Yii下,$_REQUEST获取不到前端post过来的数据_PHP Yii下,$

  这个问题出现的原因是什么呢?需要我们从YII实现的原理说起

  1.通过 curl 发送 json 格式的数据,譬如代码:

  然后在接收端,使用$_POST接收,发现打印是空的

  原因是,PHP 默认只识别 application/x-www.form-urlencoded 标准的数据类型,因此接收不到,只能通过

  来接收

  2.如果我们在Yii2框架内,想通过

  这种方式获取第一部分使用 curl json 方式传递的 post 参数,我们发现是不行的,我们需要设置 yii2 request component

  然后我们通过

  发现是可以取值的了,然后如果你打印 $_POST,会发现这里依旧没有值,这是为什么呢?

  下面我们通过代码顺藤摸瓜的查一下Yii2的源代码:

  1.打开 yiiwebRequest 找到post()方法:

  发现值是由 $this->getBodyParam($name, $defaultValue) 给予

  然后找到这个方法,代码如下:

  打印 $rawContentType=$this->getContentType(); 这个变量,发现他的值为: application/json , 然后查看函数getContentType()

  也就是 当我们发送json格式的curl请求, $_SERVER['CONTENT_TYPE'] 的值为 application/json

  2.重新回到上面的函数 getBodyParams(),他会继续执行下面的代码:

  $parser 就是根据我们下面的request component配置中的 parsers中得到'yiiwebJsonParser',进而通过容器生成出来的

  因此返回值就是 $parser->parse($this->getRawBody(), $rawContentType); 返回的,

  3.首先我们查看传递的第一个参数是函数 $this->getRawBody(),代码如下:

  通过这个函数,回到前面我们说的,可以通过

  这两种方式获取curl json传递的json数据,yii2使用的是第二种。

  然后我们打开 yiiwebJsonParser

  可以看到这里是将传递的json转换成数组,然后Yii::request->post('username')就可以从返回的这个数组中取值了

  总结:

  1.在 Yii2 框架中要用封装的 post() 和 get() 方法, 而不要使用 $_POST $_GET 等方法,因为两者是不相等的。

  2.Yii2 做 api 的时候,如果是 json 格式传递数据,一定不要忘记在 request component 中加上配置: