===== 09. APIs REST y Protocolo HTTP ===== En la arquitectura por capas, la capa de presentación (''Controller'') necesita un mecanismo para comunicarse con el exterior. En aplicaciones web y sistemas distribuidos, este intercambio se realiza mediante APIs REST sobre el protocolo ''HTTP'' (o ''HTTPS'' para comunicaciones cifradas). ==== 1. El protocolo HTTP ==== La comunicación web sigue el modelo cliente-servidor: el cliente realiza una Petición (''Request'') y el servidor procesa y devuelve una Respuesta (''Response''). === Anatomía de una URL / URI === Para localizar un recurso en la red, el cliente utiliza una ''URL'' (**Uniform Resource Locator**), formada por: * **Protocolo**: ''http://'' o ''https://'' \\ \\ * **Dominio / Host**: Identifica al servidor (''api.miservidor.com'' o ''localhost:8080'').\\ \\ * **Ruta (Path / URI)**: Identifica el recurso concreto dentro del servidor (''/api/v1/books'').\\ \\ * **Parámetros de consulta (Query Parameters)**: Información adicional tras el símbolo ''?'' (''/books?page=2&limit=10'').\\ \\ ==== 2. Servicios REST y Diseño de Endpoints ==== **REST** (**REpresentational State Transfer**) es un estilo de arquitectura para diseñar servicios web centrados en recursos. Un **Endpoint** es una ''URL'' específica expuesta por el servidor a la que el cliente envía peticiones para interactuar con un recurso. === Buenas prácticas en el diseño de Endpoints === * Usar **sustantivos en plural (nunca verbos)**: La acción la determina el método ''HTTP'', no la ''URL''.\\ \\ * **Correcto**: ''GET /books''\\ \\ * **Incorrecto**: ''GET /getBooks'' o ''POST /createBook''\\ \\ * Anidar recursos para expresar **relaciones jerárquicas**:\\ \\ * ''GET /books/12/authors'' (Obtiene los autores del libro con ID 12).\\ \\ * Filtrado y paginación mediante **Query Parameters**:\\ \\ * ''GET /books?category=fiction&page=1''\\ \\ ==== 3. Métodos HTTP y transmisión de datos ==== Cada petición ''HTTP'' utiliza un verbo o método que define la intención de la operación: ^ Método ^ Acción ^ ¿Dónde viajan los datos? ^ Descripción ^ | ''GET'' | Lectura | URL (Query / Path Params) | Consulta uno o varios recursos. No debe incluir cuerpo (body). | | ''POST'' | Creación | Cuerpo (Request Body) | Crea un nuevo recurso. El servidor asigna el ID. | | ''PUT'' | Reemplazo | Cuerpo (Request Body) | Reemplaza un recurso existente por completo. | | ''PATCH'' | Modificación parcial | Cuerpo (Request Body) | Actualiza solo los campos especificados del recurso. | | ''DELETE'' | Eliminación | URL (Path Param) | Elimina el recurso especificado. | ==== 4. Formato de Intercambio: JSON ==== ''JSON'' (**JavaScript Object Notation**) es el formato estándar para enviar y recibir información en APIs REST debido a su ligereza y facilidad de lectura tanto para humanos como para máquinas. Cuando el controlador recibe o envía datos, la librería del servidor (parser) convierte automáticamente el texto JSON en nuestras clases Java Record (DTOs) y viceversa. === Objeto JSON simple (Mapea con un DTO) === { "isbn": "978-84-376-0494-7", "title": "Don Quijote", "basePrice": 18.50 } === Colección JSON (Mapea con un List) === [ { "isbn": "978-84-376-0494-7", "title": "Don Quijote", "basePrice": 18.50 }, { "isbn": "978-84-204-1214-6", "title": "Cien años de soledad", "basePrice": 21.00 } ] ==== 5. Códigos de Estado HTTP ==== El servidor debe incluir siempre un código de estado numérico en la respuesta para indicar el resultado de la operación: * ''2xx - Éxito'':\\ \\ * ''200 OK'': Petición atendida correctamente (usado habitualmente en ''GET'', ''PUT'', ''PATCH'').\\ \\ * ''201 Created'': Recurso creado con éxito (usado en ''POST'').\\ \\ * ''204 No Content'': Petición correcta pero la respuesta no devuelve cuerpo (común en ''DELETE'').\\ \\ * ''3xx - Redirección'': Indican que el cliente debe realizar una acción adicional para completar la petición (ej. ''301 Moved Permanently'').\\ \\ * ''4xx - Errores del Cliente'':\\ \\ * ''400 Bad Request'': Datos de la petición sintáctica o semánticamente incorrectos (ej. validación de DTO fallida).\\ \\ * ''401 Unauthorized'': El cliente debe autenticarse.\\ \\ * ''403 Forbidden'': El cliente no tiene permisos para acceder al recurso.\\ \\ * ''404 Not Found'': La URL o el recurso solicitado no existe.\\ \\ * ''5xx - Errores del Servidor'':\\ \\ * ''500 Internal Server Error'': Excepción o fallo no controlado dentro del código del servidor.\\ \\