¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Symfony 5
  3. Desarrollar una API REST con Symfony
Extrait - Symfony 5 Desarrolle sitios web PHP estructurados y eficientes
Extractos del libro
Symfony 5 Desarrolle sitios web PHP estructurados y eficientes Volver a la página de compra del libro

Desarrollar una API REST con Symfony

Introducción a REST y conceptos fundamentales

Las aplicaciones web modernas casi siempre utilizan llamadas a funcionalidades remotas. Este enfoque permite beneficiarse de funcionalidades ricas y reutilizables, que los fabricantes de software ponen disponibles en Internet. Así, se facilita enormemente la integración en una aplicación o sitio web de un mapa geográfico, de funciones de pago online o incluso de redes sociales.

Los conceptos subyacentes son los de los servicios web. Históricamente, se basaba en el lenguaje XML, aunque este enfoque se ha simplificado con la llegada de los servicios de arquitectura REST, que permiten superar la naturaleza engorrosa de XML. Los servicios de arquitectura REST permiten proporcionar API reales que se pueden usar e invocar en HTTP en Internet.

1. Los conceptos de REST

REST es un acrónimo de REpresentational State Transfer. La idea es colocar una aplicación en un estado de representación de sus recursos, en función de la acción solicitada. Esta arquitectura de construcción de aplicaciones se basa en el protocolo HTTP y la noción de recurso.

REST no es estrictamente hablando un estándar, en la medida en que el W3C (World Wide Web Consortium) no lo define como tal. Sin embargo, utiliza estándares W3C existentes, tales como:

  • El protocolo HTTP.

  • Las URL.

  • Los tipos MIME.

a. Los recursos

REST asume que Internet se compone de recursos...

Administrar el formato JSON

El formato JSON es un componente indispensable de las arquitecturas REST. Aunque estas arquitecturas pueden utilizar cualquier formato de intercambio, JSON sigue siendo ampliamente aclamado gracias a su simplicidad y ligereza.

1. Introducción a JSON

El formato JSON (JavaScript Object Notation) es un formato de datos textuales inspirado en la notación de objetos JavaScript, creado a partir de 2002 por Douglas Crockford. El propósito del formato JSON es facilitar el intercambio de datos aplicativos en la Web, intercambios que con anterioridad se basaban sistemáticamente en XML. Este último se considera demasiado detallado y, por lo tanto, consume ancho de banda, con lo que JSON es una alternativa más ligera para estos intercambios.

a. Representar datos en JSON

JSON representa los datos como objetos. Están constituidos por atributos expresados a través de pares clave/valor, donde la clave se corresponde con el nombre del atributo, y el valor, con los datos asociados. Estos datos pueden ser un número, una cadena de caracteres, otro objeto o una tabla.

Las claves son cadenas de caracteres y se deben expresar entre comillas.

Los valores están separados de las claves por el carácter de dos puntos (:) y cada par clave/valor está separado del siguiente por una coma (,).

Ejemplo de estructura

...  
"clave1": "Valor de clave1",  
"clave2":...

Configurar una API REST

Configurar una API REST con Symfony es relativamente fácil, ya que el framework ofrece de forma nativa todas las herramientas necesarias. Ya hemos visto durante este libro el desarrollo de controladores y sus acciones y cómo asociarlos con URL; esto ayuda a estructurar la API.

Además, el soporte del formato JSON para el intercambio de datos nos permite manejar fácilmente este formato, tanto en la petición como en la respuesta.

1. El servicio de serializador

Antes de permitirnos manipular datos en JSON, es necesario instalar el serializador Symfony. Este serializador estará disponible como un servicio inyectable en las clases de su aplicación.

Para instalar este servicio denominado serializer, hay que ejecutar una recipe Flex con el siguiente comando:

composer require symfony/serializer-pack 

Una vez instalado, el servicio se puede inyectar en las acciones del controlador a través de la interfaz Symfony\Component\Serializer\SerializerInterface:

namespace App\Controller;   
   
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Serializer\SerializerInterface;   
   
class DefaultController extends AbstractController   
{   
   public function index(SerializerInterface $serializer)   
   {   
   ...

Objetos de petición y respuesta

Ya se han presentado los objetos Symfony que representan la petición y la respuesta HTTP y se han utilizado ampliamente en este libro. Como recordatorio, son, respectivamente, los tipos Symfony\Component\HttpFoundation\Request y Symfony\Component\HttpFoundation\Response.

En las acciones de los controladores REST, la consulta está disponible como un parámetro inyectado por Symfony en el método, y la respuesta constituye el tipo de retorno de esos métodos, como en el siguiente fragmento de código:

use Symfony\Component\Serializer\SerializerInterface;   
use Symfony\Component\HttpFoundation\Request;   
use Symfony\Component\HttpFoundation\Response;   
   
...   
   
public function crear(Request $request, SerializerInterface   
$serializer): Response   
{   
   ...   
} 

El objeto petición no siempre es necesario. De hecho, solo es útil cuando los datos se transportan en el cuerpo de la petición, normalmente en acciones relacionadas con los métodos HTTP PUT y POST.

1. Contenido y cabeceras de peticiones

Durante la manipulación de los datos entrantes, es necesario poder recuperar las cabeceras y el cuerpo de la petición.

Las cabeceras contienen el tipo de datos enviados por el cliente. Se puede acceder a esta información a través del método getContentType().

En el caso de que los datos JSON se pasen en la petición, se pasan en el cuerpo; se puede acceder a este contenido con el método getContent().

Así es como se podría estructurar el código de una acción que recibe un flujo JSON en HTTP POST:

/**   
 * @Route(   
 *      "/api/articulo",    
 *      name="api_articulo_crear",   
 *      methods={"POST"}   
 * )   
 */   
public function crear(   
   Request $request, SerializerInterface $serializer   
): Response   
{   
   // Controlamos el formato de datos entrante...   ...

Probar una API REST

1. Los límites del navegador web

Como parte del desarrollo de una aplicación web tradicional que utiliza vistas, es bastante sencillo comprobar cómo se representan las páginas usando su navegador web.

Para una API REST es diferente. De hecho, siempre podemos usarla para probar acciones que reaccionan sobre las peticiones HTTP de tipo GET, pero para las peticiones POST, PUT y DELETE es complicado; el navegador no se ha previsto para esto.

Por supuesto, podemos crear pruebas funcionales basadas en PHPUnit y los objetos Client y Crawler, como se comenta en el capítulo Probar su aplicación Symfony, pero sigue siendo práctico poder consultar las respuestas devueltas por la API en las fases de desarrollo. Para esto, utilizaremos herramientas dedicadas a las pruebas de API REST.

2. Herramientas

Las herramientas para probar las API REST solo son generadores de peticiones HTTP que permiten recibir y explorar respuestas HTTP. Como herramientas reales para el desarrollador, le permiten agrupar peticiones en proyectos, así como especificar las cabeceras y el contenido de estas peticiones.

a. Postman

Postman es una herramienta desarrollada por Google y se puede utilizar de forma gratuita. Para ello, es necesario disponer de una cuenta de Google, lo que le permite guardar sus proyectos y acceder a ellos desde cualquier lugar.

Postman se puede utilizar en línea si su aplicación ya está...

Crear una API REST con API Platform

1. Presentación

API Platform es una librería que le permite crear API REST de manera sencilla. Esta librería es mantenida por Les Tilleuls.coop (https://les-tilleuls.coop), una empresa francesa. Hay un paquete que permite utilizar toda la flexibilidad de API Platform en Symfony y, de esta manera, crear API REST en un tiempo récord. 

2. Instalación

Para tener el paquete API Platform en su proyecto, debe ejecutar la recipe Symfony correspondiente usando el comando:

composer requiere api 

Una vez que se ejecuta la recipe, API Platform está en su lugar. Puede validar la instalación navegando a la dirección http://<misitio>/api.

images/cap11_pag25.png

Por el momento, no hay operaciones disponibles, pero esto va a cambiar rápidamente con la ayuda de algunas anotaciones en las entidades Doctrine de la aplicación.

3. Configurar API Platform

Más allá de la librería instalada en la carpeta vendor/ del proyecto Symfony, la instalación de API Platform proporciona otros archivos, incluyendo:

  • config/routes/api_platform.yaml: contiene el path de la ruta utilizada para acceder a la interfaz de la API, el path /api proviene de esta declaración y se puede modificar.

  • config/packages/api_platform.yaml: contiene la configuración básica de API Platform, incluida la referencia al directorio que incluye las entidades Doctrine que se van a analizar. También es posible añadir metadatos para personalizar la interfaz.

Ejemplo de personalización:

api_platform:   
    title: "API REST para MiDiario"   
    description: "API utilizable para la aplicación móvil MiDiario" 
   version: '1.0.0'   
    mapping:   ...