9

我正在创建一个只会获取和返回 JSON 数据的 REST api。

我正在关注蛋糕指南,我的默认路线是这样的:

GET     /recipes.format
GET     /recipes/123.format
POST    /recipes.format
PUT     /recipes/123.format
DELETE  /recipes/123.format
POST    /recipes/123.format

但是,我真的不喜欢使用“.format”(在我的例子中是“.json”)的必要性,因为我只会接受 json。

我觉得必须有一种方法来消除这种必要性。我可以使用 .htaccess 重写 URL,但我觉得必须有一种方法可以在某处的蛋糕设置/配置文件中执行此操作。

简而言之,我想成为 abeGET /recipes并让它输出与本来一样的东西GET /recipes.json

谢谢!

4

2 回答 2

15

我假设您正在使用RequestHandler组件。一种方法是在控制器回调中硬编码扩展:beforeFilter()

public function beforeFilter()
{
    parent::beforeFilter();
    $this->RequestHandler->ext = 'json';
}

这样,即使启用了扩展解析并且在 URL 中提供了非 .json 扩展,它也将始终使用 JSON 视图和适当的响应标头。

另一种选择是RequestHandlerComponent::renderAs()在您的个人控制器操作中使用:

public function index()
{
    $this->RequestHandler->renderAs($this, 'json');
    ...
}

这将产生相同的效果,但您需要在所有操作中执行此操作,因此如果控制器的唯一目的是处理 REST 请求,您最好覆盖扩展。

于 2013-10-06T12:20:15.607 回答
4

首先,在routes.php文件中设置您的路由器。

Router::parseExtensions("json");

然后将 RequestHandler 组件添加到控制器(它是通过 HTTP 标头自动识别 MIME 类型并选择正确的 View Class 所必需的)。

public $components = array('RequestHandler');

现在,您可以接收 JSON 查询任何带有 .json 扩展名的控制器方法,或者通过指定具有相同效果的 HTTPAccept标头,无需指定扩展名。

curl -H "Accept: application/json" http://example.com/recipies

于 2013-10-06T12:57:48.503 回答