Comment afficher le profileur symfony pour la requête API faite dans le navigateur?

je développe une api REST avec Symfony2 + fosrest bundle.

je voudrais savoir s'il y a un moyen d'appeler l'api en mode dev (app_dev.php) à partir du navigateur (correspondant à un Accept: text/html,application/xhtml+xml en-tête) pour afficher la réponse dans le "format spécifié", enveloppé en html avec le profileur fourni par symfony.

Il permettrait de déboguer les appels à l'api directement dans le navigateur.


Modifier: Je ne veux pas déboguer la requête HTTP mais l'ensemble du processus (correspondance des routes, requêtes DB impliquées, etc.). C'est pourquoi je veux avoir accès au profileur symfony.

26
demandé sur Pyrech 2014-02-04 18:52:07

5 réponses

depuis Symfony 2.4, le profileur définit deux paramètres supplémentaires dans L'en-tête HTTP:X-Debug-Token et X-Debug-Token-Link. (voir http://symfony.com/blog/new-in-symfony-2-4-quicker-access-to-the-profiler-when-working-on-an-api)

ces en-têtes contiennent le token et le lien direct vers le profileur pour la requête courante. Ils sont toujours envoyés si le profileur est activé.

sans surprise, il y a déjà une extension Disponible pour Chrome, qui vérifie la existence de ces en-têtes et fournir des informations supplémentaires:Symfony2 Profiler raccourci

à mon avis, c'est mieux que n'importe quel HTML-wrapper personnalisé, mais cela ne fonctionne que pour les requêtes GET et peut - être POST-PUT et les requêtes DELETE sont un peu plus compliquées. Là, vous pouvez utiliser un client http, comme le chrome-extension POSTMAN et ouvrez le profileur manuellement en ouvrant le lien fourni dans l'en-tête http X-Debug-Token-Link ou garder votre profiler-page (f.e. http://example.org/_profiler/) ouvert.

44
répondu SimonSimCity 2014-03-11 08:20:44

la raison pour laquelle la barre D'outils WebDebugToolbar n'est pas affichée lors du développement d'une API JSON ou XML est que la barre d'outils est définie pour être injectée uniquement dans des réponses de type HTML.

Pour surmonter cela, vous pouvez ajouter un kernel.response event Listener dans votre paquet qui convertit vos réponses JSON ou XML en 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);
  }
}

alors vous avez juste besoin d'enregistrer l'écouteur à l'intérieur de votre paquet à la kernel.response événement, que je vous suggère de faire seulement dans l'environnement dev config.

services:
  # ...
  acme.listener.kernel.convert_html:
    class: Acme\APIBundle\Event\Listener\ConvertToHtmlResponse
    tags:
      - { name: kernel.event_listener, event: kernel.response }
12
répondu Paul Ferrett 2017-09-11 04:07:45

J'utilise Chrome Extension et très utile pendant le développement de L'API si vous ne voulez pas utiliser event Listener (cela n'a pas fonctionné pour moi): https://chrome.google.com/webstore/detail/symfony2-profiler-shortcu/denlhphadllhcolhlbbbjmhkgbknmmon

3
répondu PMoubed 2015-04-30 21:26:55

FOSRestBundle, j'utilise un modèle spécial pour afficher les données dans une page html, donc avec la barre d'outils de débogage.

dans mon controller avec annotations (vous utilisez aussi des méthodes correspondantes):

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

et dans le modèle, en choisissant le format que vous voulez:

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

C'est évidemment une solution rapide et sale, mais fait le travail. Il limite également la capacité d'Afficher des pages html réelles sur ces route.

0
répondu gou1 2014-12-05 14:15:48

vous pouvez simplement ouvrir un navigateur séparé et naviguer vers .../ app_dev.php/_profiler/ vous y trouverez toutes vos demandes faites à app_dev.php, y compris l'appariement externe, les requêtes DB impliquées, etc.

0
répondu 10us 2017-07-20 11:49:41