如何在浏览器中显示API请求的符号分析器?

2022-08-30 13:38:16

我正在开发一个带有Symfony2 + FOSRest捆绑包的REST api。

我想知道是否有任何方法可以在开发模式下()从浏览器(对应于标头)调用api,以“指定格式”显示响应,并使用symfony提供的探查器包装在html中。app_dev.phpAccept: text/html,application/xhtml+xml

它将允许直接在浏览器中调试对api的调用。


编辑:我不想调试HTTP请求,而是调试整个过程(路由匹配,涉及的数据库查询等)。这就是为什么我想访问symfony分析器。


答案 1

从 Symfony 2.4 开始,探查器在 HTTP 标头中设置了两个附加设置:和 。(见 http://symfony.com/blog/new-in-symfony-2-4-quicker-access-to-the-profiler-when-working-on-an-apiX-Debug-TokenX-Debug-Token-Link)

这些标头包含令牌和指向当前请求的探查器的直接链接。如果启用了探查器,则始终会发送它们。

毫不奇怪,已经有一个适用于Chrome的扩展程序,可以检查这些标头是否存在并提供额外的信息:Symfony2 Profiler快捷方式

在我看来,这比任何自定义的html包装器都要好,但这仅适用于GET和POST请求 - PUT和DELETE请求有点棘手。在那里,您可以使用http客户端,如chrome扩展POSTMAN,并通过打开http标题中提供的链接手动打开探查器,或者保持您的探查器页面(例如 http://example.org/_profiler/)打开。X-Debug-Token-Link


答案 2

开发 JSON 或 XML API 时不显示 WebDebugToolbar 的原因是工具栏设置为仅注入 HTML 类型的响应中。

为了克服这个问题,您可以在捆绑包中添加一个事件侦听器,它将JSON或XML响应转换为HTML。kernel.response

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

services:
  # ...
  acme.listener.kernel.convert_html:
    class: Acme\APIBundle\Event\Listener\ConvertToHtmlResponse
    tags:
      - { name: kernel.event_listener, event: kernel.response }

推荐