【问题标题】:Sending correct JSON content type for CakePHP为 CakePHP 发送正确的 JSON 内容类型
【发布时间】:2013-02-03 10:44:59
【问题描述】:

在我的 CakePHP 应用程序中,我返回 JSON 并退出某些请求。例如,尝试以 GET 请求的形式访问 API 以进行登录:

header('Content-Type: application/json');
echo json_encode(array('message'=>'GET request not allowed!'));
exit;

但是,我必须在 echo 前面加上内容类型,才能将其作为 JSON 发送。否则我在另一端的代码会有不同的解释。

关于如何解决这个问题的任何想法?或者至少改进一下。

更新:Cake 2.3.0 版

【问题讨论】:

  • 这是 JSON 内容的正确标头。将标题添加到您的内容没有任何问题。应该是这样的。
  • 实际上,如果您没有明确发送 HTML Content-Type,PHP 已经宠坏了您。所以这确实是应该的。
  • 如果这让您感到困扰,只需创建一个像 send_my_json($array) 这样的包装函数,它会发送正确的 header(),然后在提供的参数上调用 json_encode()
  • 我想知道为什么 a) 你没有提到你的蛋糕版本(现在你应该知道这对于获得正确答案至关重要)和 b) 你不使用 2.x 的响应对象(你可能已经知道它的存在了..)
  • json 只是纯文本,因此 text/plain 也是有效的 mime 类型。如果接收端如何进行,那么重要的是什么。例如jquery 可以使用 mime 类型来检测 json 并自动为您决定。

标签: php cakephp


【解决方案1】:

您可以利用新的 2.x 响应对象:

public function youraction() {
    // no view to render
    $this->autoRender = false;
    $this->response->type('json');

    $json = json_encode(array('message'=>'GET request not allowed!'));
    $this->response->body($json);
}

http://book.cakephp.org/2.0/en/controllers/request-response.html#cakeresponse

您还可以使用强大的休息功能和 RequestHandlerComponent 自动实现这一点,如文档所示:http://book.cakephp.org/2.0/en/views/json-and-xml-views.html

您只需要允许扩展 json 并将您的操作称为/controller/action.json。 然后 cake 将自动使用 JsonView,您只需将您的数组传入。它将由视图类生成 JSON 和有效响应。

这两种方法都比您的“退出”解决方案更干净 - 尝试对包含 die()/exit() 的代码进行单元测试。这将悲惨地结束。所以最好一开始就不要在你的代码中使用它。

【讨论】:

  • 那么关于这个主题的快速问题。我在这里问了一个问题:stackoverflow.com/questions/14945418/… 在哪里设置内容类型的标头会破坏之前在 beforeFiler/beforeRender 中设置的访问控制。你能解释一下吗?正如您在此处回答的解决方案也解决了该问题中的问题。谢谢。
  • 是的,标题可以被覆盖。这就是为什么当您可以轻松地使用响应对象以干净的方式完成时,您永远不会手动输出标头。
  • @mark stackoverflow.com/questions/42810819/…请看这个问题。
  • @mark 这个解决方案对我不起作用.. 请看看我的问题。谢谢
  • 在 3.x 中,响应是不可变的 - 你需要说 $this->response = $this->response->with...() 等。
猜你喜欢
  • 2023-04-10
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 2010-10-03
相关资源
最近更新 更多