En este articulo vamos a descubrir como podemos aceptar peticiones JSON con el framework de desarrollo web Symfony.
Cuando estamos desarrollando una API en Symfony podemos optar por utilizar algún bundle de terceros como FOSRestBundle o montárnoslo por nuestra cuenta teniendo mayor control en la comunicación con el cliente. Yo os invito a que intentéis probar la primera solución ya que es un bundle bastante completo y que sigue con las convenciones de la especificación REST, además de ser recomendado por los mismos desarrolladores de Symfony.
Sin embargo cuando implemento una API REST para un proyecto suelo implementarlo por mi cuenta, pudiendo tomar decisiones más personalizables a la hora de elegir el sistema de autenticación, los formatos de respuesta, etc… Generalmente una petición http contiene un body con los datos que se envían al servidor y hay distintas opciones de enviarlos. Por convención, si trabajamos con JSON todas las peticiones deben incluir la cabecera Content-Type con valor application/json.
Symfony no trata los datos de esta petición cuando llegan a un controlador, por lo que la mejor solución es crear un Event Listener que detecte si la petición contiene la cabecera con el valor application/json, valide que contenido del body se trata de un json correctamente formato e idealmente inyectar en la request los valores como si se trataran de un formulario.
Las ventajas de inyectar estos valores en la Reqeust es que podemos tratar los datos con un formulario de Symfony que se encargue de validar estos datos siendo totalmente transparente para el controlador el formato de los datos recibidos.. A continuación os dejo el código del EventListener implementado en Symfony que aplica esta solución