Подтвердить что ты не робот

Как отобразить профилировщик symfony для запроса API, сделанного в браузере?

Я разрабатываю REST api с пакетом Symfony2 + FOSRest.

Я хотел бы знать, есть ли какой-либо способ для вызова api в режиме dev (app_dev.php) из браузера (соответствующий заголовку Accept: text/html,application/xhtml+xml), чтобы отобразить ответ в "указанном формате", завернутый в html с профилировщиком, предоставленным symfony.

Это позволит отлаживать вызовы в api непосредственно в браузере.


Изменить: Я не хочу отлаживать HTTP-запрос, но весь процесс (сопоставление маршрутов, вовлеченные запросы БД и т.д.). Поэтому я хочу получить доступ к профилировщику symfony.

4b9b3361

Ответ 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 }

Ответ 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, вовлеченные запросы БД и т.д.