2

我遵循了本教程http://symfony.com/doc/current/cookbook/controller/error_pages.html,并且在 app/Resources/TwigBundle/views/Exception/ 中有 error.html.twig 和 error.json.twig

即使请求的内容类型设置为 application/json,所有错误都默认为错误页面的 html 版本。

路由的格式也定义了: http://symfonyinstall/api/v1/users.json

请求标头:

Accept: application/json
Content-Type: application/json
Connection: keep-alive
Origin: chrome-extension: //rest-console-id
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko)           Chrome/18.0.1025.162 Safari/535.19

响应标头:

Status Code: 404
date: Sun, 29 Apr 2012 06:54:35 GMT
Content-Encoding: gzip
X-Powered-By: PHP/5.3.10
Transfer-Encoding: chunked
Connection: keep-alive
Server: nginx
Content-Type: text/html; charset=UTF-8
cache-control: no-cache

我没有想法......我真的需要一个 json 版本的错误才能让我的 API 工作......

4

1 回答 1

0

我刚刚遇到了同样的问题,尽管您的问题已经很老了,并且 symfony 从那时起增加了几个版本,但问题仍然存在,所以即使您不再需要知道它,也许其他人会知道。

您最初的问题可能是由此处描述的错误引起的,但在最初发布后并没有太多关于它的事情。从那时起,整个代码库都被更新了,所以虽然同样的症状再次出现,但错误并不相关。我在这里发布它是因为这些天寻找答案的任何人都可能会找到这个问题(就像我一样:)。

即使JsonResponse直接从内核异常处理程序中返回,它仍然会有Content-Type: text/html; charset=UTF-8. 这让我非常难过,以至于我使用 netcat 发出手动请求,中间没有任何智能软件,结果证明这种情况下的响应实际上有两个不同的 Content-Type 标头:

HTTP/1.0 500 Internal Server Error
Connection: close
X-Powered-By: PHP/5.5.9-1ubuntu4.17
Content-Type: text/html; charset=UTF-8
Cache-Control: private, must-revalidate
Content-Type: application/json
pragma: no-cache
expires: -1
X-Debug-Token: 775c55
X-Debug-Token-Link: http://127.0.0.1:8000/_profiler/775c55
Date: Thu, 27 Oct 2016 23:08:31 GMT

现在,双 Content-Type 标头不是您每天都能看到的。似乎这是在Symfony\Component\Debug\ExceptionHandler仅在调试模式下使用的类中实现的。为了尽可能的健壮,它首先呈现描述抛出异常的标准 Symfony 错误页面。渲染的内容不会直接发回,而是利用 PHP 的输出缓冲功能来缓冲和存储生成的输出。然后它尝试从框架生成自定义错误页面。如果失败,则会发送先前准备好的消息。

然而,输出缓冲仅适用于消息内容,而不适用于标题 - 这些总是直接发送。这个问题只出现在调试环境中,异常内容类型的错误只在WebAPI中很常见,调试模式可以说用处不大。这使得暴露面相对较小,但是如果需要测试同时提供 WebAPI 和最终用户界面的应用程序,这可能会成为一个问题。

在不修改内部 Symfony 文件的情况下解决这个问题似乎是不可能的。输出控制位于 symfony 内核深处,不提供任何配置。无论如何,我不相信这种解决方案的好处。如果有人可以向我解释在自定义异常处理程序期间可能发生的事情,这会使默认处理程序在失败的情况下变得无用吗?也许用户代码弄乱了 ob_* 函数?

于 2016-10-28T00:07:22.590 回答