如何在浏览器中显示API请求的symfony profiler?

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-TokenX-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)


10u*_*0us 5

您只需打开一个单独的浏览器并浏览到 .../app_dev.php/_profiler/ ,您将在其中找到对 app_dev.php 所做的所有请求,包括路由匹配、涉及的数据库查询等。