SpringBoot
Tutorial SpringBoot: Introducción a controladores REST
Aprende a crear controladores REST en Spring Boot usando @RestController y @GetMapping para exponer endpoints HTTP de forma sencilla.
Aprende SpringBoot y certifícateFundamento teórico de las API REST
Las API REST (Representational State Transfer) constituyen un estilo arquitectónico que define un conjunto de principios para diseñar servicios web escalables y mantenibles. Este paradigma se basa en la idea de que los recursos del sistema pueden ser identificados, accedidos y manipulados mediante operaciones estándar del protocolo HTTP.
Principios fundamentales de REST
REST se fundamenta en seis restricciones arquitectónicas que garantizan la escalabilidad y simplicidad del sistema:
Arquitectura cliente-servidor: Separa las responsabilidades entre el cliente (que consume los datos) y el servidor (que los proporciona), permitiendo que evolucionen independientemente.
Sin estado (Stateless): Cada petición del cliente debe contener toda la información necesaria para ser procesada. El servidor no mantiene información sobre el estado de la sesión entre peticiones.
Cacheable: Las respuestas deben indicar explícitamente si pueden ser almacenadas en caché para mejorar el rendimiento y reducir la carga del servidor.
Interfaz uniforme: Define un conjunto consistente de operaciones que simplifican la arquitectura y mejoran la visibilidad de las interacciones.
Sistema en capas: Permite organizar la arquitectura en capas jerárquicas, donde cada capa solo conoce la inmediatamente inferior.
Código bajo demanda (opcional): El servidor puede enviar código ejecutable al cliente cuando sea necesario.
Recursos y URIs
En REST, todo se modela como un recurso. Un recurso es cualquier información que puede ser nombrada: un documento, una imagen, un servicio temporal, una colección de otros recursos, o un objeto no virtual. Cada recurso se identifica mediante una URI (Uniform Resource Identifier) única.
https://api.ejemplo.com/usuarios/123
https://api.ejemplo.com/productos
https://api.ejemplo.com/pedidos/456/items
Los recursos se organizan de forma jerárquica, donde las URIs reflejan las relaciones entre entidades. Esta estructura intuitiva facilita la comprensión y navegación de la API.
Métodos HTTP y operaciones CRUD
REST aprovecha los métodos HTTP para definir las operaciones que se pueden realizar sobre los recursos. Cada método tiene una semántica específica que se alinea con las operaciones CRUD:
- GET: Recupera la representación de un recurso. Es idempotente y seguro, no modifica el estado del servidor.
GET /usuarios/123
GET /productos?categoria=electronica
- POST: Crea un nuevo recurso. No es idempotente, cada llamada puede crear un recurso diferente.
POST /usuarios
POST /productos
- PUT: Actualiza completamente un recurso existente o lo crea si no existe. Es idempotente.
PUT /usuarios/123
PUT /productos/789
- DELETE: Elimina un recurso. Es idempotente en cuanto al resultado final.
DELETE /usuarios/123
DELETE /productos/789
Representaciones y tipos de contenido
Los recursos pueden tener múltiples representaciones (JSON, XML, HTML), pero en aplicaciones modernas, JSON se ha convertido en el estándar de facto por su simplicidad y eficiencia. El cliente especifica el formato deseado mediante el header Accept
, mientras que el servidor indica el formato de la respuesta con Content-Type
.
{
"id": 123,
"nombre": "Juan Pérez",
"email": "juan@ejemplo.com",
"fechaCreacion": "2024-01-15T10:30:00Z"
}
Códigos de estado HTTP
Las respuestas HTTP utilizan códigos de estado estándar para comunicar el resultado de la operación:
2xx (Éxito): La petición fue procesada correctamente
200 OK
: Operación exitosa201 Created
: Recurso creado exitosamente204 No Content
: Operación exitosa sin contenido de respuesta4xx (Error del cliente): La petición contiene errores
400 Bad Request
: Petición malformada404 Not Found
: Recurso no encontrado409 Conflict
: Conflicto con el estado actual del recurso5xx (Error del servidor): Error interno del servidor
500 Internal Server Error
: Error interno no especificado
Ventajas de las API REST
La adopción de REST proporciona múltiples beneficios para el desarrollo de aplicaciones distribuidas:
- Simplicidad: Utiliza estándares web existentes (HTTP, URIs, JSON)
- Escalabilidad: La ausencia de estado facilita la distribución horizontal
- Flexibilidad: Permite múltiples representaciones y evolución independiente
- Interoperabilidad: Compatible con cualquier lenguaje o plataforma que soporte HTTP
- Cacheable: Mejora el rendimiento mediante estrategias de caché
Esta base teórica establece los cimientos para implementar servicios web robustos y escalables. Spring Boot proporciona las herramientas necesarias para materializar estos conceptos mediante anotaciones y configuraciones que simplifican significativamente el desarrollo de API REST.
Anotaciones @RestController y @GetMapping para crear un hola mundo
Spring Boot simplifica enormemente la creación de controladores REST mediante anotaciones especializadas que eliminan la configuración manual y permiten centrarse en la lógica de negocio. Las anotaciones @RestController
y @GetMapping
constituyen los elementos fundamentales para exponer endpoints HTTP de forma declarativa.
La anotación @RestController
La anotación @RestController combina la funcionalidad de @Controller
y @ResponseBody
, indicando que la clase manejará peticiones HTTP y que los métodos devolverán directamente datos serializados (típicamente JSON) en lugar de vistas. Esta anotación elimina la necesidad de anotar cada método individual con @ResponseBody
.
@RestController
public class HolaMundoController {
// Los métodos aquí devolverán automáticamente JSON
}
Spring detecta automáticamente las clases anotadas con @RestController
durante el escaneo de componentes, registrándolas como beans en el contenedor de inversión de control. Esto significa que no necesitas configuración adicional para que Spring reconozca tu controlador.
La anotación @GetMapping
La anotación @GetMapping es una especialización de @RequestMapping
que maneja específicamente peticiones HTTP GET. Esta anotación mapea una URL específica a un método del controlador, definiendo así un endpoint de la API.
@RestController
public class HolaMundoController {
@GetMapping("/hola")
public String saludar() {
return "¡Hola Mundo desde Spring Boot!";
}
}
En este ejemplo, cuando un cliente realiza una petición GET a /hola
, Spring invoca el método saludar()
y devuelve la cadena como respuesta HTTP. Spring automáticamente serializa el valor de retorno al formato apropiado (por defecto JSON para objetos complejos, texto plano para strings).
Creando tu primer controlador REST
Para crear un controlador REST funcional, necesitas seguir estos pasos básicos:
1. Crear la clase del controlador:
package com.ejemplo.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HolaMundoController {
@GetMapping("/")
public String inicio() {
return "Bienvenido a la API REST";
}
@GetMapping("/hola")
public String hola() {
return "¡Hola Mundo!";
}
@GetMapping("/saludo")
public String saludo() {
return "Saludos desde Spring Boot";
}
}
2. Estructura del proyecto:
El controlador debe ubicarse en el paquete base de la aplicación o en un subpaquete para que Spring Boot lo detecte automáticamente. Si tu clase principal está en com.ejemplo.demo
, el controlador puede estar en com.ejemplo.demo.controller
.
3. Ejecutar y probar:
Una vez que ejecutes la aplicación Spring Boot, los endpoints estarán disponibles en:
http://localhost:8080/
http://localhost:8080/hola
http://localhost:8080/saludo
Devolviendo objetos complejos
Los controladores REST pueden devolver objetos Java que Spring serializa automáticamente a JSON:
@RestController
public class HolaMundoController {
@GetMapping("/usuario")
public Usuario obtenerUsuario() {
Usuario usuario = new Usuario();
usuario.setNombre("Juan");
usuario.setEmail("juan@ejemplo.com");
return usuario;
}
@GetMapping("/mensaje")
public Mensaje obtenerMensaje() {
return new Mensaje("¡Hola Mundo!", "Mensaje de bienvenida");
}
}
class Usuario {
private String nombre;
private String email;
// Constructores, getters y setters
public String getNombre() { return nombre; }
public void setNombre(String nombre) { this.nombre = nombre; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
}
class Mensaje {
private String texto;
private String descripcion;
public Mensaje(String texto, String descripcion) {
this.texto = texto;
this.descripcion = descripcion;
}
// Getters
public String getTexto() { return texto; }
public String getDescripcion() { return descripcion; }
}
Cuando accedas a /usuario
, obtendrás una respuesta JSON como:
{
"nombre": "Juan",
"email": "juan@ejemplo.com"
}
Configuración de rutas con @RequestMapping
Puedes organizar mejor tus endpoints utilizando @RequestMapping a nivel de clase para definir un prefijo común:
@RestController
@RequestMapping("/api")
public class HolaMundoController {
@GetMapping("/hola")
public String hola() {
return "¡Hola desde /api/hola!";
}
@GetMapping("/estado")
public String estado() {
return "API funcionando correctamente";
}
}
Con esta configuración, los endpoints serán accesibles en:
http://localhost:8080/api/hola
http://localhost:8080/api/estado
Manejo automático de headers HTTP
Spring Boot configura automáticamente los headers HTTP apropiados para las respuestas REST. Para respuestas JSON, establece Content-Type: application/json
, mientras que para texto plano utiliza Content-Type: text/plain
.
@RestController
public class HolaMundoController {
@GetMapping("/info")
public Map<String, String> informacion() {
Map<String, String> info = new HashMap<>();
info.put("aplicacion", "Demo Spring Boot");
info.put("version", "1.0.0");
info.put("estado", "activo");
return info;
}
}
Este endpoint devolverá automáticamente una respuesta JSON con el header Content-Type: application/json
.
La combinación de @RestController
y @GetMapping
proporciona una forma elegante y declarativa de crear endpoints REST funcionales con mínima configuración. Spring Boot maneja automáticamente la serialización, el mapeo de URLs y la configuración de headers, permitiendo que te concentres en implementar la lógica de tu aplicación.
Otras lecciones de SpringBoot
Accede a todas las lecciones de SpringBoot y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Introducción A Spring Boot
Introducción Y Entorno
Spring Boot Starters
Introducción Y Entorno
Inyección De Dependencias
Introducción Y Entorno
Crear Proyecto Con Spring Initializr
Introducción Y Entorno
Crear Proyecto Desde Visual Studio Code
Introducción Y Entorno
Controladores Spring Mvc
Spring Mvc Con Thymeleaf
Vista En Spring Mvc Con Thymeleaf
Spring Mvc Con Thymeleaf
Controladores Spring Rest
Spring Mvc Con Thymeleaf
Open Api Y Cómo Agregarlo En Spring Boot
Spring Mvc Con Thymeleaf
Servicios En Spring
Spring Mvc Con Thymeleaf
Clientes Resttemplate Y Restclient
Spring Mvc Con Thymeleaf
Rxjava En Spring Web
Spring Mvc Con Thymeleaf
Métodos Post En Controladores Mvc
Spring Mvc Con Thymeleaf
Métodos Get En Controladores Mvc
Spring Mvc Con Thymeleaf
Formularios En Spring Mvc
Spring Mvc Con Thymeleaf
Crear Proyecto Con Intellij Idea
Spring Mvc Con Thymeleaf
Introducción A Los Modelos Mvc
Spring Mvc Con Thymeleaf
Layouts Y Fragmentos En Thymeleaf
Spring Mvc Con Thymeleaf
Estilización Con Bootstrap Css
Spring Mvc Con Thymeleaf
Gestión De Errores Controlleradvice
Spring Mvc Con Thymeleaf
Estilización Con Tailwind Css
Spring Mvc Con Thymeleaf
Introducción A Controladores Rest
Spring Rest
Métodos Get En Controladores Rest
Spring Rest
Métodos Post En Controladores Rest
Spring Rest
Métodos Delete En Controladores Rest
Spring Rest
Métodos Put Y Patch En Controladores Rest
Spring Rest
Gestión De Errores Restcontrolleradvice
Spring Rest
Creación De Entidades Jpa
Spring Data Jpa
Asociaciones De Entidades Jpa
Spring Data Jpa
Repositorios Spring Data
Spring Data Jpa
Métodos Find En Repositorios
Spring Data Jpa
Inserción De Datos
Spring Data Jpa
Actualizar Datos De Base De Datos
Spring Data Jpa
Borrar Datos De Base De Datos
Spring Data Jpa
Consultas Jpql Con @Query En Spring Data Jpa
Spring Data Jpa
Api Query By Example (Qbe)
Spring Data Jpa
Api Specification
Spring Data Jpa
Repositorios Reactivos
Spring Data Jpa
Configuración Base De Datos Postgresql
Spring Data Jpa
Configuración Base De Datos Mysql
Spring Data Jpa
Introducción A Jpa Y Spring Data Jpa
Spring Data Jpa
Configuración Base De Datos H2
Spring Data Jpa
Testing Unitario De Componentes Y Servicios
Testing Con Spring Test
Testing De Repositorios Spring Data Jpa
Testing Con Spring Test
Testing Controladores Spring Mvc Con Thymeleaf
Testing Con Spring Test
Testing Controladores Rest Con Json
Testing Con Spring Test
Testing De Aplicaciones Reactivas Webflux
Testing Con Spring Test
Testing De Seguridad Spring Security
Testing Con Spring Test
Testing Con Apache Kafka
Testing Con Spring Test
Introducción Al Testing
Testing Con Spring Test
Introducción A Spring Security
Seguridad Con Spring Security
Seguridad Basada En Formulario
Seguridad Con Spring Security
Registro De Usuarios En Api Rest
Seguridad Con Spring Security
Login De Usuarios En Api Rest
Seguridad Con Spring Security
Validación Jwt En Api Rest
Seguridad Con Spring Security
Autenticación Jwt Completa En Api Rest
Seguridad Con Spring Security
Seguridad Jwt En Api Rest Reactiva Spring Webflux
Seguridad Con Spring Security
Autenticación Y Autorización Con Anotaciones
Seguridad Con Spring Security
Fundamentos De Autenticación Oauth
Seguridad Con Spring Security
Autenticación Oauth Con Github
Seguridad Con Spring Security
Testing Con Spring Security Test
Seguridad Con Spring Security
Autenticación Oauth En Api Rest
Seguridad Con Spring Security
Introducción A Spring Webflux
Reactividad Webflux
Spring Data R2dbc
Reactividad Webflux
Controlador Reactivo Basado En Anotaciones
Reactividad Webflux
Controlador Reactivo Basado En Funciones
Reactividad Webflux
Operadores Reactivos Básicos
Reactividad Webflux
Operadores Reactivos Avanzados
Reactividad Webflux
Cliente Reactivo Webclient
Reactividad Webflux
Introducción E Instalación De Apache Kafka
Mensajería Asíncrona
Crear Proyecto Con Apache Kafka
Mensajería Asíncrona
Creación De Producers
Mensajería Asíncrona
Creación De Consumers
Mensajería Asíncrona
Kafka Streams En Spring Boot
Mensajería Asíncrona
Integración Con Angular
Integración Frontend
Integración Con React
Integración Frontend
Integración Con Vue
Integración Frontend
Ejercicios de programación de SpringBoot
Evalúa tus conocimientos de esta lección Introducción a controladores REST con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.
Crear entidades JPA
Controladores Spring MVC
Asociaciones de entidades JPA
Creación de entidades
Reto servicio PedidoService
Reto controlador REST
Consultas JPQL
Reto test controlador REST
Anotaciones JPA
Relación ManyToOne con Tarea y Proyecto
CRUD Customers Spring MVC + Spring Data JPA
Backend API REST con Spring Boot
Filtrar categorías por nombre
Reto controlador MVC Categoría
Entidad y repositorio
Métodos derivados y consultas JPQL en repositorios
En esta lección
Objetivos de aprendizaje de esta lección
- Comprender los principios fundamentales y restricciones arquitectónicas de REST.
- Identificar cómo se modelan los recursos y se utilizan URIs en una API REST.
- Conocer los métodos HTTP y su relación con las operaciones CRUD.
- Aprender a crear controladores REST en Spring Boot con @RestController y @GetMapping.
- Entender la serialización automática de objetos Java a JSON y la configuración de rutas y headers HTTP en Spring Boot.