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