php - tutorial - ¿Cómo mostrar el generador de perfiles de Symfony para la solicitud de API realizada en el navegador?
demo api platform (5)
Estoy desarrollando una API REST con el paquete Symfony2 + FOSRest.
Me gustaría saber si hay alguna manera de llamar al api en modo dev ( app_dev.php
) desde el navegador (que corresponde a un encabezado Accept: text/html,application/xhtml+xml
) para mostrar la respuesta en el "formato especificado", envuelto en html con el generador de perfiles proporcionado por Symfony.
Permitiría depurar llamadas a la API directamente en el navegador.
Editar: no quiero depurar la solicitud HTTP sino todo el proceso (correspondencia de ruta, consultas de DB involucradas, etc.). Es por eso que quiero tener acceso al generador de perfiles de Symfony.
Con FOSRestBundle , utilizo una plantilla especial para mostrar los datos en una página html, por lo tanto, con la barra de herramientas de depuración.
En mi controlador con anotaciones (también usas los métodos correspondientes):
@View(template="AppBundle:Api:data.html.twig", templateVar="data")
Y en la plantilla, elija el formato que desee:
<body>
<pre>{{ data | serialize(''json'') }}</pre>
</body>
Obviamente es una solución rápida y sucia , pero cumple su función. También limita la capacidad de mostrar páginas html reales en esas rutas.
Desde Symfony 2.4, el generador de perfiles establece dos configuraciones adicionales en el encabezado HTTP: X-Debug-Token
y X-Debug-Token-Link
. (ver http://symfony.com/blog/new-in-symfony-2-4-quicker-access-to-the-profiler-when-working-on-an-api )
Estos encabezados contienen el token y el enlace directo al generador de perfiles para la solicitud actual. Siempre se envían si el generador de perfiles está habilitado.
No es sorprendente que ya exista una extensión disponible para Chrome, que compruebe la existencia de estos encabezados y brinde información adicional: acceso directo Symfony2 Profiler
En mi opinión, esto es mejor que cualquier html-wrapper personalizado, pero esto solo funciona para solicitudes GET y quizás POST: las solicitudes PUT y DELETE son un poco más complicadas. Allí puede usar un cliente HTTP, como el POSTMAN de extensión chrome y abrir el generador de perfiles manualmente abriendo el enlace provisto en el encabezado http X-Debug-Token-Link
o mantener su página profiler (fe http://example.org/_profiler/ ) abierto.
El motivo por el que WebDebugToolbar no se muestra al desarrollar una API JSON o XML es que la barra de herramientas está configurada para ser solo inyectada en las respuestas de tipo HTML.
Para superar esto, podría agregar un kernel.response
eventos kernel.response
en su paquete, que convierte sus respuestas JSON o 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);
}
}
Entonces solo necesita registrar el oyente dentro de su paquete en el evento kernel.response
, que le sugiero que haga solo en la configuración del entorno dev.
services:
# ...
acme.listener.kernel.convert_html:
class: Acme/APIBundle/Event/Listener/ConvertToHtmlResponse
tags:
- { name: kernel.event_listener, event: kernel.response }
Estoy usando Chrome Extension y es muy útil durante el desarrollo de la API si no quieres utilizar Event Listener (No funcionó): https://chrome.google.com/webstore/detail/symfony2-profiler-shortcu / denlhphadllhcolhlbbbjmhkgbknmmon
Simplemente puede abrir un navegador por separado y navegar a ... / app_dev.php / _profiler / allí encontrará todas sus solicitudes hechas a app_dev.php incluyendo coincidencia de oute, consultas de DB involucradas, etc.