Как отобразить профилировщик symfony для запроса API, сделанного в браузере?
Я разрабатываю REST api с пакетом Symfony2 + FOSRest.
Я хотел бы знать, есть ли какой-либо способ для вызова api в режиме dev (app_dev.php
) из браузера (соответствующий заголовку Accept: text/html,application/xhtml+xml
), чтобы отобразить ответ в "указанном формате", завернутый в html с профилировщиком, предоставленным symfony.
Это позволит отлаживать вызовы в api непосредственно в браузере.
Изменить:
Я не хочу отлаживать HTTP-запрос, но весь процесс (сопоставление маршрутов, вовлеченные запросы БД и т.д.). Поэтому я хочу получить доступ к профилировщику symfony.
Ответы
Ответ 1
Начиная с 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 Профилер ярлык
По-моему, это лучше, чем любой пользовательский html-wrapper, но это работает только для запросов GET и, возможно, POST. Запросы PUT и DELETE немного сложнее. Там вы можете использовать http-клиент, например chrome-extension POSTMAN, и открыть профилировщик вручную, открыв ссылку, указанную в http-header X-Debug-Token-Link
, или сохраните ваш профиль-страница (fe http://example.org/_profiler/).
Ответ 2
Причина, по которой WebDebugToolbar не отображается при разработке JSON или XML API, заключается в том, что панель инструментов настроена только для ввода ответов HTML-типа.
Чтобы преодолеть это, вы можете добавить kernel.response
Event Listener в свой Bundle, который преобразует ваши ответы 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 }
Ответ 3
Я использую расширение Chrome и очень полезно при разработке API, если вы не хотите использовать Event Listener (для меня это не сработало): https://chrome.google.com/webstore/detail/symfony2-profiler-shortcu/denlhphadllhcolhlbbbjmhkgbknmmon
Ответ 4
С FOSRestBundle я использую специальный шаблон для отображения данных на странице html, поэтому с панелью инструментов отладки.
В моем контроллере с аннотациями (вы также используете соответствующие методы):
@View(template="AppBundle:Api:data.html.twig", templateVar="data")
И в шаблоне выберите любой формат, который вам нравится:
<body>
<pre>{{ data | serialize('json') }}</pre>
</body>
Это , очевидно, быстрое и грязное решение, но выполняет эту работу. Это также ограничивает возможность отображения фактических html-страниц на этих маршрутах.
Ответ 5
Вы можете просто открыть отдельный браузер и перейти к.../app_dev.php/_profiler/там вы найдете все ваши запросы, сделанные в app_dev.php, включая сопоставление oute, вовлеченные запросы БД и т.д.