我正在用Symfony2 + FOSRest包开发REST。
我想知道是否有任何方法从浏览器(对应于Accept: text/html,application/xhtml+xml
头)调用开发模式下的api (Accept: text/html,application/xhtml+xml
),以“指定格式”显示响应,并使用symfony提供的分析器包装在html中。
它允许在浏览器中直接调试对api的调用。
编辑:我不想调试HTTP请求,而是调试整个过程(路由匹配、DB查询等)。这就是我想要访问symfony分析器的原因。
发布于 2014-03-11 00:20:44
自从Symfony 2.4以来,分析器在header中设置了另外两个设置:X-Debug-Token
和X-Debug-Token-Link
。(见http://symfony.com/blog/new-in-symfony-2-4-quicker-access-to-the-profiler-when-working-on-an-api)
这些标头包含当前请求的令牌和到分析器的直接链接。如果启用了分析器,则始终发送它们。
毫不奇怪,Chrome已经有了一个扩展,可以检查这些头文件是否存在,并提供额外的信息:Symfony2 Profiler shortcut
在我看来,这比任何定制的html包装都要好,但这只适用于GET,也许还适用于POST请求-- PUT和DELETE请求要复杂一些。在那里,您可以使用http客户端,如铬扩展POSTMAN,并通过打开http-header X-Debug-Token-Link
中提供的链接或保留分析器页面(f.e )手动打开分析器。( profiler/)开放。
发布于 2014-02-12 12:47:52
开发JSON或XML时没有显示WebDebugToolbar的原因是工具栏被设置为只被注入到HTML响应中。
为了克服这一问题,您可以在绑定中添加一个kernel.response
事件侦听器,它将您的JSON或XML响应转换为HTML。
namespace Acme\APIBundle\Event\Listener;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
class ConvertToHtmlResponse {
public function onKernelResponse(FilterResponseEvent $event) {
if (!$event->isMasterRequest()) {
return;
}
$request = $event->getRequest();
// Only send back HTML if the requestor allows it
if (!$request->headers->has('Accept') || (false === strpos($request->headers->get('Accept'), 'text/html'))) {
return;
}
$response = $event->getResponse();
switch ($request->getRequestFormat()) {
case 'json':
$prettyprint_lang = 'js';
$content = json_encode(json_decode($response->getContent()), JSON_PRETTY_PRINT);
break;
case 'xml':
$prettyprint_lang = 'xml';
$content = $response->getContent();
break;
default:
return;
}
$response->setContent(
'<html><body>' .
'<pre class="prettyprint lang-' . $prettyprint_lang . '">' .
htmlspecialchars($content) .
'</pre>' .
'<script src="https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/run_prettify.min.js"></script>' .
'</body></html>'
);
// Set the request type to HTML
$response->headers->set('Content-Type', 'text/html; charset=UTF-8');
$request->setRequestFormat('html');
// Overwrite the original response
$event->setResponse($response);
}
}
然后,只需将包中的侦听器注册到kernel.response
事件,我建议您只在dev环境配置中这样做。
services:
# ...
acme.listener.kernel.convert_html:
class: Acme\APIBundle\Event\Listener\ConvertToHtmlResponse
tags:
- { name: kernel.event_listener, event: kernel.response }
发布于 2017-07-20 03:49:41
您只需打开一个单独的浏览器,浏览到./ app_dev.php /_profiler/,就会发现您对app_dev.php的所有请求都已完成,包括路由匹配、所涉及的DB查询等。
https://stackoverflow.com/questions/21555697
复制