web-dev-qa-db-fra.com

Comment afficher le profileur symfony pour la requête d'API effectuée dans le navigateur?

Je développe une REST - api avec le bundle Symfony2 + FOSRest.

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

Cela permettrait de déboguer les appels à l'API directement dans le navigateur.


Edit: Je ne veux pas déboguer la requête HTTP mais l’ensemble du processus (correspondance de route, requêtes de base de données, etc.). C'est pourquoi je souhaite avoir accès au profileur de symfony.

26
Pyrech

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-worken-on-an-api )

Ces en-têtes contiennent le jeton et le lien direct vers le profileur de la demande en cours. Ils sont toujours envoyés si le profileur est activé.

Sans surprise, il existe déjà une extension disponible pour Chrome, qui vérifie l'existence de ces en-têtes et fournit des informations supplémentaires: Raccourci Symfony2 Profiler

À mon avis, c'est mieux que n'importe quel wrapper HTML personnalisé, mais cela ne fonctionne que pour les requêtes GET et peut-être POST - les requêtes PUT et DELETE sont un peu plus délicates. Vous pouvez y utiliser un client http, comme chrome-extension POSTMAN et ouvrir le profileur manuellement en ouvrant le lien fourni dans l'en-tête http X-Debug-Token-Link ou conserver votre page de profileur (fe http: // example.org/_profiler/ ) ouvert.

46
SimonSimCity

Si WebDebugToolbar ne s'affiche pas lors du développement d'une API JSON ou XML, c'est que la barre d'outils est configurée pour être uniquement injectée dans les réponses de type HTML.

Pour résoudre ce problème, vous pouvez ajouter un écouteur d'événements kernel.response dans votre ensemble, qui convertira 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);
  }
}

Ensuite, il vous suffit d’enregistrer l’écouteur de votre bundle dans l’événement kernel.response, ce que je vous suggère de ne faire que dans la configuration de l’environnement de développement.

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

J'utilise Chrome Extension et est très utile lors du développement de l'API si vous ne souhaitez pas utiliser Event Listener (cela n'a pas fonctionné pour moi): https://chrome.google.com/webstore/detail/symfony2-profiler -shortcu/denlhphadllhcolhlbbbjmhkgbknmmon

3
PMoubed

Avec 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 contrôleur avec des annotations (vous utilisez également les méthodes correspondantes):

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

Et dans le modèle, choisissez le format de votre choix:

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

C'est évidemment une solution rapide et sale , mais fait le travail. Cela limite également la possibilité d’afficher des pages HTML réelles sur ces itinéraires.

0
gou1

Vous pouvez simplement ouvrir un navigateur séparé et accéder à .../app_dev.php/_profiler/vous y trouverez toutes vos demandes effectuées sur app_dev.php, y compris la correspondance des abonnés, les requêtes de base de données, etc.

0
10us