我正在开发YII(1.x)REST API。我想按照以下格式更新网址
GET api/user => Should return list of User
GET api/user/$id => Should return one USER with provided ID
DELETE api/user/$id => Should delete respective user
我在主配置文件中添加了以下代码
array('api/list', 'pattern' => 'api/<model:\w+>', 'verb' => 'GET'),
array('api/view', 'pattern' => 'api/<model:\w+>/<id:\d+>', 'verb' => 'GET'),
array('api/update', 'pattern' => 'api/<model:\w+>/<id:\d+>', 'verb' => 'PUT'),
array('api/delete', 'pattern' => 'api/<model:\w+>/<id:\d+>', 'verb' => 'DELETE'),
无法按预期工作,访问代码我必须以下列格式提供网址
http://myServer/index.php/api/user/view/model/user/id/$USERID
以上网址返回$_GET
值array("id"=>$USERID);
如果我使用以下网址(我想使用)
http://myServer/index.php/api/user/$USERID
它将$_GET
值返回NULL或有时返回array($USERID => NULL);
请让我知道相同的解决方案。
答案 0 :(得分:1)
我已经使用Yii 1.1.10和1.1.14测试了你的规则,它确实适用于两个版本。
这是用于urlManager的配置:
'urlManager'=>array(
'urlFormat' => 'path',
'showScriptName'=>true,
'rules'=>array(
array('api/list', 'pattern' => 'api/<model:\w+>', 'verb' => 'GET'),
array('api/view', 'pattern' => 'api/<model:\w+>/<id:\d+>', 'verb' => 'GET'),
array('api/update', 'pattern' => 'api/<model:\w+>/<id:\d+>', 'verb' => 'PUT'),
array('api/delete', 'pattern' => 'api/<model:\w+>/<id:\d+>', 'verb' => 'DELETE'),
),
)
您可以看到我必须将urlFormat设置为'path',否则规则将无法按预期工作,因为您不会将参数作为查询字符串传递。
并使用以下网址进行测试:
/index.php/api/User
/index.php/api/User/123
通过指向列表和查看操作,它们可以正常工作。
最后一点:
您还应该检查您是否使用了可以修改配置文件中原始规则的CUrlManager扩展名。
在另一个项目中,我使用的是MLUrlManager扩展,它在每个规则前添加了前缀。如果您使用它,则应根据规则是字符串还是数组来调整代码以对其进行不同的处理。
示例:
$newRules = array();
foreach ($this->rules as $reg => $rule) {
if ($reg === 'robots.txt') {
$newRules[$reg] = $rule;
} elseif (is_string($rule)) {
$newRules['<language:'.$langReg.'>/'.$reg] = $rule;
} elseif (is_array($rule)) { // special handling for rules defined as array
$rule['pattern']='<language:'.$langReg.'>/'.$rule['pattern'];
$newRules[$reg] = $rule;
}
}
答案 1 :(得分:0)
这就是我们如何运作:
'api/<controller:\w+>'=>array('<controller>/restList', 'verb'=>'GET'),
'api/<controller:\w+>/<id:\w*>'=>array('<controller>/restView', 'verb'=>'GET'),
'api/<controller:\w+>/<id:\w*>/<var:\w*>'=>array('<controller>/restView', 'verb'=>'GET'),
'api/<controller:\w+>/<id:\w*>/<var:\w*>/<var2:\w*>'=>array('<controller>/restView', 'verb'=>'GET'),
array('<controller>/restUpdate', 'pattern'=>'api/<controller:\w+>/<id:\w*>', 'verb'=>'PUT'),
array('<controller>/restUpdate', 'pattern'=>'api/<controller:\w+>/<id:\w*>/<var:\w*>', 'verb'=>'PUT'),
array('<controller>/restUpdate', 'pattern'=>'api/<controller:\w*>/<id:\w*>/<var:\w*>/<var2:\w*>', 'verb'=>'PUT'),
array('<controller>/restDelete', 'pattern'=>'api/<controller:\w+>/<id:\w*>', 'verb'=>'DELETE'),
array('<controller>/restDelete', 'pattern'=>'api/<controller:\w+>/<id:\w*>/<var:\w*>', 'verb'=>'DELETE'),
array('<controller>/restDelete', 'pattern'=>'api/<controller:\w+>/<id:\w*>/<var:\w*>/<var2:\w*>', 'verb'=>'DELETE'),
array('<controller>/restCreate', 'pattern'=>'api/<controller:\w+>', 'verb'=>'POST'),
array('<controller>/restCreate', 'pattern'=>'api/<controller:\w+>/<id:\w+>', 'verb'=>'POST'),