Yii2:REST POST请求参数未到达操作

时间:2015-05-18 14:32:37

标签: php rest yii2

我正在使用Yii2制作REST API 我启用了漂亮的网址via /config/web.php

'urlManager' => [
        'enablePrettyUrl' => true,
        //'enableStrictParsing' => true,
        'showScriptName' => false,
        'rules' => $routes,
]  

这是$ routes变量的内容(基本上只是我的规则与web.php配置文件分开的php脚本的内容):

return [
        '<controller:[\w\-]+>/<id:\d+>' => '<controller>/view',
        '<controller:[\w\-]+>/<action:[\w\-]+>/<id:\d+>' => '<controller>/<action>',
        '<controller:[\w\-]+>/<action:[\w\-]+>' => '<controller>/<action>',
        'api/<controller:[\w\-]+>/<action:[\w\-]+>/<id:\d+>' => 'api/<controller>/<action>',
        'api/<controller:[\w\-]+>/<action:[\w\-]+>' => 'api/<controller>/<action>',
        'module/<module:[\w\-]+>/<controller:[\w\-]+>/<action:[\w\-]+>' => '<module>/<controller>/<action>',
        ['class' => 'yii\rest\UrlRule',
         'controller' => [
            'api/x_controller',
            'api/y_controller',
            'api/z_controller'
            ],
         'pluralize' => false,
        ]
];

它工作得很好,除了我无法获取我发送的任何参数(我瞄准JSON,但也试图发送application/x-www-form-urlencoded数据并得到相同的结果) 。
尝试从请求中获取任何类型参数的当前代码是:

public function actionDoSomething  
{
    $contentType = Yii::$app->request->getContentType();
    $raw = Yii::$app->request->getRawBody();
    $queryParams = Yii::$app->request->getQueryParams();
    $bodyParams = Yii::$app->request->getBodyParams();
    $token = Yii::$app->request->getBodyParam('access_token');
    $userID = Yii::$app->request->getBodyParam('user_id');
    $rawJson = file_get_contents("php://input");
}

不幸的是,即使我发送{"access_token":"XXXtoken","userId":"60"}的POST请求,所有这些变量都是null或为空。

我猜它是关于我的urlManager的,但我无法弄清楚它是什么。

2 个答案:

答案 0 :(得分:2)

看来问题根本不在Yii2中 检查我们的GoDaddy配置后,我们发现我们的A记录指向了错误的IP 在将其指向正确的IP之后,问题就解决了。

说实话,我不希望请求到达服务器,因为配置的那部分是错误的。

答案 1 :(得分:0)

过去,我在中间件位置使用过类似的东西,一次解析出各种类型的输入。

//Store the various HTTP methods to check against
$methods_to_check = array('POST', 'PUT');    

//Check if this request should be parsed
if(in_array(strtoupper(Yii::$app->request->getMethod()), $methods_to_check)){
    //Initialize the value to store data in
    $input = '';

    //Get reference to PHP's input
    $file_handle = fopen('php://input', 'r');

    //Loop through PHP's input until end of stream is reached
    while(!feof($file_handle)){
        $s = fread($file_handle, 64);

        $input .= $s;
    }

    //Close reference to PHP's input
    fclose($file_handle);

    //Check if any data was passed, and merge the JSON-decoded version of it into the $_POST array
    if(!empty($input)) $_POST = array_merge($_POST, (array)json_decode($input));
}