Pyr*_*ech 30 php symfony fosrestbundle
我正在使用Symfony2 + FOSRest软件包开发REST api.
我想知道是否有任何方式app_dev.php
从浏览器(对应于Accept: text/html,application/xhtml+xml
标题)调用dev模式()中的api以"指定格式"显示响应,用symfony提供的探查器包装在html中.
它允许直接在浏览器中调试对api的调用.
编辑:我不想调试HTTP请求,而是整个过程(路由匹配,涉及的数据库查询等).这就是我想要访问symfony探查器的原因.
Sim*_*ity 47
从Symfony 2.4开始,探查器在HTTP标头中设置了两个附加设置: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快捷方式
在我看来,这比任何自定义的html包装都要好,但这只适用于GET和POST请求 - PUT和DELETE请求有点棘手.在那里,您可以使用http客户端,例如chrome-extension POSTMAN,并通过打开http-header中提供的链接手动打开探查器,或者打开X-Debug-Token-Link
您的探查器页面(fe http://example.org/_profiler/).
Pau*_*ett 13
在开发JSON或XML API时未显示WebDebugToolbar的原因是工具栏设置为仅注入HTML类型的响应.
要解决这个问题,您可以kernel.response
在Bundle中添加一个Event Listener,它将您的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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后你只需要在你的bundle中注册监听器到kernel.response
事件,我建议你只在dev环境配置中做.
services:
# ...
acme.listener.kernel.convert_html:
class: Acme\APIBundle\Event\Listener\ConvertToHtmlResponse
tags:
- { name: kernel.event_listener, event: kernel.response }
Run Code Online (Sandbox Code Playgroud)
您只需打开一个单独的浏览器并浏览到 .../app_dev.php/_profiler/ ,您将在其中找到对 app_dev.php 所做的所有请求,包括路由匹配、涉及的数据库查询等。
归档时间: |
|
查看次数: |
16196 次 |
最近记录: |