限时 5折! 详情
Yii::$app->request->bodyParams;获取不到数据
8 757 2017-08-31

问题:Yii::$app->request->bodyParams;获取不到数据,但Yii::$app->request->get();可以获取。 目的:当实现 RESTful APIs 接口的时候,经常需要获取通过PUT, PATCH或者其他的 request methods 请求方法提交上来的参数。可以通过调用 yii\web\Request::getBodyParam() 方法来获取这些参数。

访问方式:http://my.api.com/v1/objectdata?id=1&name=111 控制器代码如下:

namespace api\modules\v1\controllers;

use yii;
use yii\rest\ActiveController;
use yii\web\Response;

class ObjectdataController extends ActiveController
{
    public $modelClass = 'app\models\Objectdata';

    public function behaviors() {
        $behaviors = parent::behaviors();

        //格式化输出
        $behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_JSON;
        return $behaviors;
    }

//    public $serializer = [
//        'class' => 'yii\rest\Serializer',
//        'collectionEnvelope' => 'items',
//    ];

    public function actions()
    {
        $actions = parent::actions(); // TODO: Change the autogenerated stub

        //注销
        unset($actions['index'], $actions['update'], $actions['create'], $actions['delete'], $actions['view']);

        return $actions;
    }

    public function actionIndex()
    {
        $request = Yii::$app->request;

        // 返回所有参数
        $params = $request->bodyParams;

        // 返回参数 "id"
        $param = $request->getBodyParam('id');
        return $param;
    }

}
  • 8 个回答
  • 以PUT请求为例,假设body类型是raw,请求主体内容是json格式

    request组件配置如下

    'request' => [
                'parsers' => [
                    '*' => 'yii\web\JsonParser',
                ]
            ],

    通过request组件的getBodyParams方法可以正确获取json格式的参数内容

    Yii::$app->getRequest()->getBodyParams();

    如果依然存在问题,你可以把你的请求方式以curl的代码贴一下

  • 问题: Yii::$app->request->bodyParams;方法获妈不到数据。

    访问方式如下:

    curl -i -H "Accept:application/json" "http://my.api.com/v1/objectdata?id=1&name=&a=qwe"

    返回如下:

    HTTP/1.1 200 OK
    Server: nginx/1.10.3 (Ubuntu)
    Date: Fri, 01 Sep 2017 07:29:29 GMT
    Content-Type: application/json; charset=UTF-8
    Transfer-Encoding: chunked
    Connection: keep-alive

    request配置如下:

    'request' => [
                'baseUrl' => '',
                'csrfParam' => '_csrf-api',
                'parsers' => [
                    'application/json' => 'yii\web\JsonParser',
                    'application/xml' => 'common\components\XmlParser',
                    'text/xml' => 'common\components\XmlParser'
                ]
            ]

  • get参数的获取,直接用 Yii::$app->getRequest()->get() 方法不可以获取吗?

  • Yii::$app->getRequest()->get(); 和 Yii::$app->getRequest()->post();方法获取没有问题, 我考虑到前端ajax可能会以GET ,POST,PUT,PATCH 等等这些提交上来的参数,所以打算每个接口都使用Yii::$app->request->bodyParams;获取,不知是否可行。

    别外又遇到一个问题,我现在restful API 用多数据库操作,数据库配置如下:

    //MySQl数据库
            'db' => [
                'class' => 'yii\db\Connection',
                'dsn' => 'mysql:host=localhost;dbname=thyroid',
                'username' => 'root',
                'password' => '12345678',
                'charset' => 'utf8',
            ],
            //PostgreSQL
            'db2' => [
                'class' => 'yii\db\Connection',
                'dsn' => 'pgsql:host = localhost;port=5432;dbname=orthanc',
                'username' => 'alvin',
                'password' => '12345678',
                'charset' => 'utf8',
            ],

    控制器如下:

    namespace api\modules\v1\controllers;
    
    use yii\rest\ActiveController;
    use yii\web\Response;
    use common\models\Publics;
    
    class ThyStudyController extends ActiveController
    {
    
        public $modelClass = 'app\models\ThyStudy';
        public $params;
    
        public function behaviors() {
    
            $behaviors = parent::behaviors();
            //格式化输出
            $behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_JSON;
            return $behaviors;
        }
    
    //    public $serializer = [
    //        'class' => 'yii\rest\Serializer',
    //        'collectionEnvelope' => 'items',
    //    ];
    
        public function actions()
        {
            $actions = parent::actions(); // TODO: Change the autogenerated stub
    
            //注销
            unset($actions['index'], $actions['update'], $actions['create'], $actions['delete'], $actions['view']);
    
            return $actions;
        }
        public function actionIndex()
        {
            return 'hello world!';
        }
    
    }

    其中 public $modelClass = 'app\models\ThyStudy';只声明了db库中的表,那么我要声明db2中的表再加一条 public $modelClass2 = 'app\models\ThyStudy2;可行吗?或都有更好的办法? 在你的站里没找到相关文章。

  • 先看第一个问题,接口的行为肯定是实现约定好了,比如你可以约定规则,所有的接口请求方法都是post。不可能说一开始约定get方式,后期改为post了。
    第二个问题,$modelClass的声明是为了默认action操作方便,跟db声明没任何关系。
    以AR模型映射的数据表模型来看,不可能会出现一个AR模型对象多个数据库的多张数据表,这本身是矛盾的。
    这里你配置了多个db,没明白你是哪里有问题?
    如果是不知道多个db如何使用,可以用 Yii::$app->db,或者 Yii::$app->db2等操作。
    如果多个AR属于多个不同的db,你可以为每一个AR模型单独配置tableName方法和getDb方法
    参考如下

    public static function tableName()
    {
        return 'thyroid.blog';
    }
    
    public static function getDb()
    {
        return Yii::$app->db;
    }
    
    public static function tableName()
    {
        return 'orthanc.category';
    }
    
    public static function getDb()
    {
        return Yii::$app->db2;
    }

  • 明白你的意思了,两个问题:
    1。Yii::$app->request->bodyParams;获取不到数据的问题怎么解决呢?
    2。如果对方以GET,POST之外的方法如PUT,PATCH等提交请求,我应该以哪种方法获取呢?Yii::$app->getRequest()->get(); 或 Yii::$app->getRequest()->post();?

  • 晕,竟然还没懂。。
    get就Yii::$app->getRequest()->get();
    post,put,patch 都可以用 Yii::$app->getRequest()->post(); 或者 Yii::$app->getRequest()->getBodyParams() 获取。
    客户端请求的Content-Type 类型将影响你具体要获取的方式,比如 x-www-form-urlencoded 以上方法通用。

  • 懂了 ,就是纠结。不是说Yii::$app->request->bodyParams;可以获取所有请求方法的参数,我这个获取不到怎么讲啊?

登录 去赚佣金