我在路线文件中有这个:
CakePlugin::routes();
Router::mapResources('api');
Router::parseExtensions('json');
目前,如果我调用控制器,我将Api与.json作为扩展名,只要它是HTTP GET(不是帖子)它输出json就好了,无论方法/函数名称是什么,只要它存在于我的Api控制器。
如果我发帖,虽然我可以解码已发布的JSON我调用的任何函数/方法,但是错误说我在app / Api / Views / json /中缺少xxx.ctp xxx.ctp =我要发布的任何函数的名称。
2个问题/问题。
理想情况下,我想将任何请求解析为Api控制器作为json,但无需在url中指定.json扩展名。
其次,如何/为什么HTTP POST输出json不能像HTTP GET一样,我是否需要在某处映射其他东西?
非常感谢
答案 0 :(得分:3)
如果要将特定控制器(在您的情况下,ApiController.php)中的所有内容呈现为JSON而不要求用户在其请求中附加.json扩展名,则可以在beforeFilter中使用renderAs和setContent。
public function beforeFilter() {
parent::beforeFilter();
$this->RequestHandler->setContent('json');
$this->RequestHandler->renderAs($this, 'json');
}
renderAs和setContent是RequestHandler的一部分。
这确实意味着此控制器永远不会返回除json之外的任何内容。如果您对此感到满意,您甚至可以在routes.php文件中删除扩展捕手......
Router::parseExtensions('json');
请记住,如果从routes.php文件中删除上述行,对任何类型的ApiController的请求将导致抛出404(而不是JSON)。
使用beforeFilter进一步开发,您实际上可以根据请求的类型呈现为不同的内容类型。例如..
public function beforeFilter() {
parent::beforeFilter();
if ($this->RequestHandler->isGet()) {
$this->RequestHandler->setContent('json');
$this->RequestHandler->renderAs($this, 'json');
}
}