web-dev-qa-db-ja.com

ブラウザで行われたAPIリクエストのsymfonyプロファイラーを表示するにはどうすればよいですか?

REST Symfony2 + FOSRestバンドルでapiを開発しています。

「指定された形式」で応答を表示するために、ブラウザー(app_dev.phpヘッダーに対応)から開発モード(Accept: text/html,application/xhtml+xml)でAPIを呼び出す方法があるかどうか知りたい、symfonyが提供するプロファイラーでhtmlにラップされます。

これにより、ブラウザーでAPIへの呼び出しを直接デバッグできます。


編集:HTTPリクエストをデバッグしたくありませんが、プロセス全体(ルートマッチング、関連するDBクエリなど)をデバッグします。だからこそ、symfonyプロファイラーにアクセスしたいのです。

31
Pyrech

Symfony 2.4以降、プロファイラーはHTTPヘッダーにX-Debug-TokenX-Debug-Token-Linkの2つの追加設定を設定します。 ( http://symfony.com/blog/new-in-symfony-2-4-quicker-access-to-the-profiler-when-working-on-an-api を参照)

これらのヘッダーには、トークンと、現在のリクエストのプロファイラーへの直接リンクが含まれています。プロファイラーが有効になっている場合は常に送信されます。

当然のことながら、これらのヘッダーの存在をチェックし、追加情報を提供するChromeで利用可能な拡張機能がすでにあります: Symfony2プロファイラーショートカット

私の意見では、これはカスタムhtmlラッパーよりも優れていますが、これはGETでのみ機能し、POSTリクエスト-PUTとDELETEリクエストは少しトリッキーです。そこでhttpクライアントを使用できます。 、chrome-extension [〜#〜] postman [〜#〜] のように、http-header X-Debug-Token-Linkで提供されるリンクを開いてプロファイラーを手動で開くか、プロファイラーページを保持します(fe http://example.org/_profiler/ )を開きました。

47
SimonSimCity

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 }
13
Paul Ferrett

私はChrome拡張機能を使用しており、イベントリスナーを使用したくない場合はAPI開発中に非常に役立ちます(私にはうまくいきませんでした): https:// chrome。 google.com/webstore/detail/symfony2-profiler-shortcu/denlhphadllhcolhlbbbjmhkgbknmmon

3
PMoubed

別のブラウザーを開いて.../app_dev.php/_profiler /にアクセスするだけで、outeマッチングや関連するDBクエリなど、app_dev.phpに対して行われたすべてのリクエストを見つけることができます。

1
10us

FOSRestBundleでは、特別なテンプレートを使用してデータをHTMLページに表示するため、デバッグツールバーを使用します。

注釈付きのコントローラー(対応するメソッドも使用します):

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

そして、テンプレートで、好きなフォーマットを選択してください:

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

明らかにクイック&ダーティなソリューションですが、仕事をします。また、これらのルートに実際のHTMLページを表示する機能も制限されます。

0
gou1