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

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

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

Это позволило бы отлаживать вызовы API прямо в браузере.


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


person Pyrech    schedule 04.02.2014    source источник
comment
в chrome/консоли, правая кнопка мыши включает XMLHttprequests   -  person Grumpy    schedule 04.02.2014
comment
Разработка HTTP-клиента для Chrome, я выбираю вас!   -  person moonwave99    schedule 04.02.2014
comment
Спасибо за ваши ответы, но я не хочу отлаживать HTTP-запрос, я хочу иметь доступ к панели инструментов отладки symfony для отладки всего процесса. Я отредактировал свой вопрос, чтобы уточнить это.   -  person Pyrech    schedule 04.02.2014
comment
Как насчет загрузки вызова API в iframe и изменения кода в этот ответ, так что панель инструментов загружается в основной фрейм? Однако iframe преобразует вывод в HTML. Будет ли это хорошим решением? Если да, то могу написать ответ.   -  person Thomas Potaire    schedule 05.02.2014
comment
Хорошая точка зрения. Я не думал использовать токен отладки через другой запрос. Я думаю, что это можно даже предложить в качестве PR для репозитория FOSRest. Что может быть интересным, так это иметь прослушиватель, который проверяет, исходит ли вызов из браузера, и заставляет фреймворк возвращать отформатированные данные, обернутые в профилировщик html + sf. Но iframe тоже должен работать.   -  person Pyrech    schedule 05.02.2014
comment
Вам следует подумать об изменении принятого ответа, так как теперь есть официальный способ сделать это, и он упоминается @SimonSimCity.   -  person Francesco Casula    schedule 08.02.2016


Ответы (5)


Начиная с 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 POSTMAN, и открыть профилировщик. вручную, открыв ссылку, указанную в http-заголовке X-Debug-Token-Link, или сохраните свою страницу профилировщика (например, http://example.org/_profiler/) открыл.

person SimonSimCity    schedule 11.03.2014

Вы можете просто открыть отдельный браузер и перейти к .../app_dev.php/_profiler/, где вы найдете все ваши запросы, сделанные для app_dev.php, включая сопоставление oute, задействованные запросы к БД и т. д.

person 10us    schedule 20.07.2017

В FOSRestBundle я использую специальный шаблон для отображения данных на html-странице, поэтому с панелью инструментов отладки.

В моем контроллере с аннотациями (вы также используете соответствующие методы):

@View(template="AppBundle:Api:data.html.twig", templateVar="data")

И в шаблоне, выбрав любой формат, который вам нравится:

<body>
    <pre>{{ data | serialize('json') }}</pre>
</body>

Это очевидно, быстрое и грязное решение, но оно работает. Это также ограничивает возможность отображения фактических html-страниц на этих маршрутах.

person gou1    schedule 05.12.2014

Я использую свой WithProfilerTrait, который применяет панель инструментов только в том случае, если вы переходите к URL-адресу в браузере и пропускаете изменение, если это запрос ajax.

// in Controller:
return $this->withProfiler($response, $request->isXmlHttpRequest());
trait WithProfilerTrait
{
    protected function withProfiler(Response $response, bool $skip = false): Response
    {
        if ($skip === true) {
            return $response;
        }

        $wrappedContent = '<body><pre>' . $response->getContent() . '</pre></body>';
        $response->headers->set('Content-Type', 'html');
        return $response->setContent($wrappedContent);
    }
}
person auipga    schedule 12.06.2020

person    schedule
comment
Спасибо :) Именно то, что я хотел получить! Я знал об условиях появления профилировщика, но не знал, как правильно его реализовать. ИМО, это лучше, чем взламывать токен отладки в iframe, как было предложено выше. - person Pyrech; 13.02.2014