【问题标题】:Content length: 0 in a json response Symfony2内容长度:0 在 json 响应 Symfony2
【发布时间】:2011-12-19 05:22:47
【问题描述】:

总是空白,我的控制器中有这样的操作

/**
 * @Route("/check/{key}.json", defaults={"_format"="json"})
 * @Template()
 */
public function processAction($upload_key)
{
  /* make thing */
  return array('data' => $process_data);
}

在我的 process.json.twig 文件中

{% set res = { 'data': data } %}
{{ res | json_enconde | raw }}

其他形式

{{ { 'data': data } | json_enconde | raw }}

我也试过这个:

{{ 'hello' | json_encode | raw }}

在 chrome 中我得到这个响应:

Connection:close
Content-Length:0
Content-Type:application/json
Date:Mon, 19 Dec 2011 05:13:17 GMT
Server:Apache/2.2.20 (Ubuntu)
X-Powered-By:PHP/5.3.6-13ubuntu3.3

从服务器上什么也得不到,我无法解决这个问题

【问题讨论】:

    标签: symfony json


    【解决方案1】:

    有两种方法可以实现这一点,这取决于您喜欢哪种方式以及您的操作是否应该支持多种_format 类型。

    选项 A - 仅返回 JSON 的操作

    你可以完全绕过模板。

    在您的控制器中删除 @Template 注释,而不是 return new Response(json_encode($process_data));

    选项 B - 支持不同格式的操作,或者您只想在模板中呈现 JSON

    通过呈现不同格式的动作,我指的是带有路由的动作:

    @Route("/check/{key}.{_format}", defaults={"_format"="json"}
    @Template
    

    虽然这个问题中的控制器遵循“仅支持 JSON 但您想在模板中呈现它的操作”的路线。

    假设控制器的processAction 返回return array('data' => $process_data);,然后在名为process.json.twig 的模板中将其呈现为JSON,应按如下方式完成{{ data|json_encode }},则无需预处理data 或将其转换为另一个数组或模板内的任何类似内容。

    【讨论】:

    • @rkmax:不,我不会说这是一个错误。无论如何,只返回 JSON 数据作为来自控制器的响应更有效,因为 Symfony 不需要执行模板阶段。我不确定它为什么根本不调用模板,但也许它知道 _format="json" 何时应该将内容类型设置为 application/json 并期望在响应中提供适当的数据。
    • 无论如何,我有疑问,我已经报告为错误,看看他们告诉我什么
    • @rkmax:我对 TWIG 和 json_encode 进行了更多研究,我认为您可能可以使用 {{ data|json_encode }},您可能还需要过滤 raw。在您上面的模板代码中,您正在对来自控制器的data 进行一些预处理,因此这可能是问题所在。仅当您将 {_format} 作为路线的一部分 (@Route("/check/{key}.{_format}", defaults={"_format"="json"})) 以及如果您希望一个操作支持多种格式时,使用模板才有意义。
    • 其实和一开始一样,更像是在 Symfony 中工作的 1.x
    • @rkmax:对不起,我认为那里的翻译是最后的;)。 {{ data|json_encode }} 也有效吗?
    猜你喜欢
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    相关资源
    最近更新 更多