【问题标题】:CakePHP (2.4) routes jsonCakePHP (2.4) 路由 json
【发布时间】:2014-02-18 19:19:37
【问题描述】:

我的路由文件中有这个:

CakePlugin::routes();
Router::mapResources('api');
Router::parseExtensions('json');

目前,如果我调用控制器,只要它是 HTTP GET(而不是发布),它就会输出带有 .json 作为扩展名的 Api,无论方法/函数名称如何,只要它存在于我的API 控制器。

如果我发帖,虽然我可以对发布的 JSON 进行解码,但无论我调用什么函数/方法,它都会错误提示我在 app/Api/Views/json/ 中缺少 xxx.ctp xxx.ctp = 我调用发布的任何函数的名称。

2 个问题/问题。

理想情况下,我想将任何对 Api 控制器的请求解析为 json,但不必在 url 中指定 .json 扩展名。

其次,HTTP POST 如何/为什么不能像 HTTP GET 那样输出 json,我是否需要在其他地方映射一些东西?

非常感谢

【问题讨论】:

  • 你的期望是有缺陷的。输出应始终对应于文件类型/扩展名。因此,对于 JSON 响应,您始终需要 json 扩展。如果您使用 xml,您将获得 XML,如果您不使用扩展名,您将获得 HTTP。这就是它应该如何工作的。不是你所期望的。见AJAX and CakePHP。如果您只想要 JSON,请确保所有其他错误 (4xx) 正确。

标签: cakephp cakephp-2.4


【解决方案1】:

如果您想将来自特定控制器(在您的情况下为 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');
           }
    }

【讨论】:

  • 你没有解决第二点(虽然我不知道问题是什么 - 没有足够的细节)请求处理程序示例+1。
  • 谢谢。我发布的代码适用于 GET 和 POST 请求,也解决了第一个问题。另外,我刚刚扩展了答案以包含有关如何以不同方式处理请求类型的信息,尽管这不是要求的。
  • 干杯,这确实掩盖了这两个问题。
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 2012-08-17
  • 2015-11-21
相关资源
最近更新 更多