【问题标题】:Cakephp REST API remove the necessity of .formatCakephp REST API 消除了 .format 的必要性
【发布时间】:2013-10-12 16:41:47
【问题描述】:

我正在创建一个只会获取和返回 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,但我觉得必须有一种方法可以在某处的蛋糕设置/配置文件中执行此操作。

简而言之,我想成为 GET /recipes 并让它输出与 GET /recipes.json 相同的东西。

谢谢!

【问题讨论】:

    标签: json api rest cakephp-2.0


    【解决方案1】:

    我假设您使用的是RequestHandler component。一种方法是在你的控制器beforeFilter()回调中硬编码extension

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

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

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

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

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

    【讨论】:

    • 两者都工作得非常好和简单。非常感谢,我想我最终会使用 beforeFilter 覆盖。很简单,谢谢!
    • wtf?为什么每个 REST 手册中都缺少这一点?为我工作。非常感谢:)
    【解决方案2】:

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

    Router::parseExtensions("json");

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

    public $components = array('RequestHandler');

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

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

    【讨论】:

    • 这很好用,谢谢,尽管我最终还是采用了 ndm 提供的解决方案,因为它不需要为每个请求发送额外的标头。不过谢谢!
    猜你喜欢
    • 2019-06-20
    • 2018-11-26
    • 2012-03-14
    • 2012-07-03
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 2022-11-30
    • 2013-07-10
    相关资源
    最近更新 更多