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.
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.
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 }
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
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.
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.