我正在使用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的,但我无法弄清楚它是什么。
答案 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));
}