Saltar al contenido principal

Rest Controller

Guía sobre Spring Boot: RestController y sus Funcionalidades

Spring Boot simplifica la creación de APIs REST utilizando anotaciones y clases preconfiguradas. A continuación se detallan las principales anotaciones y componentes para construir controladores REST, explicando su propósito y mostrando ejemplos prácticos.

1. @RestController

La anotación @RestController indica que la clase manejará peticiones HTTP y devolverá directamente objetos serializados (generalmente en JSON o XML). Combina las funcionalidades de @Controller y @ResponseBody, evitando la necesidad de escribir ambas.

Propósito:
Permitir que los métodos de la clase retornen datos directamente en el cuerpo de la respuesta HTTP, facilitando la creación de servicios RESTful.

Ejemplo:

@RestController
@RequestMapping("/api/usuarios")
public class UsuarioController {

@GetMapping
public List<Usuario> listarUsuarios() {
return List.of(new Usuario("Juan"), new Usuario("María"));
}
}

2. @RequestMapping y Métodos HTTP

@RequestMapping define la ruta base o personalizada de un endpoint. Se puede combinar con métodos específicos como @GetMapping, @PostMapping, @PutMapping y @DeleteMapping para indicar el tipo de operación HTTP.

Propósito:
Configurar rutas y métodos HTTP para cada acción del controlador.

Ejemplo:

@RestController
@RequestMapping("/api")
public class ProductoController {

@RequestMapping(value = "/productos", method = RequestMethod.GET)
public List<String> listar() {
return List.of("Teclado", "Mouse", "Monitor");
}
}

3. @PathVariable

Permite capturar valores directamente desde la URL, facilitando la obtención de parámetros dinámicos.

Propósito:
Extraer valores de la ruta para usarlos en la lógica del método.

Ejemplo:

@GetMapping("/productos/{id}")
public String obtenerProducto(@PathVariable Long id) {
return "Producto con ID: " + id;
}

4. @RequestParam

Se utiliza para obtener parámetros enviados en la URL como query params.

Propósito:
Recibir valores opcionales o requeridos desde la cadena de consulta.

Ejemplo:

@GetMapping("/buscar")
public String buscar(@RequestParam String nombre, @RequestParam(required = false) String categoria) {
return "Buscando " + nombre + " en categoría " + categoria;
}

5. @RequestBody

Permite recibir datos en formato JSON desde el cuerpo de la solicitud, útil para crear o actualizar recursos.

Propósito:
Deserializar el cuerpo de la petición HTTP en un objeto Java.

Ejemplo:

@PostMapping("/crear")
public String crearUsuario(@RequestBody Usuario usuario) {
return "Usuario creado: " + usuario.getNombre();
}

6. Obtención de Headers con @RequestHeader

Podemos leer encabezados HTTP de la solicitud usando @RequestHeader.

Propósito:
Acceder a información adicional enviada por el cliente, como el tipo de navegador o tokens de autenticación.

Ejemplo:

@GetMapping("/headers")
public String obtenerHeaders(@RequestHeader("User-Agent") String userAgent) {
return "El cliente usa: " + userAgent;
}

7. ResponseEntity

ResponseEntity permite controlar completamente la respuesta HTTP, incluyendo el código de estado, cuerpo y encabezados.

Propósito:
Personalizar la respuesta enviada al cliente, ajustando el estado y los datos retornados.

Ejemplo:

@GetMapping("/status")
public ResponseEntity<String> estado() {
return ResponseEntity.status(HttpStatus.ACCEPTED).body("Petición aceptada");
}

8. Agregar Headers Personalizados

Es posible agregar nuevos headers a la respuesta usando ResponseEntity.

Propósito:
Enviar información adicional al cliente, como identificadores personalizados o metadatos.

Ejemplo:

@GetMapping("/custom-header")
public ResponseEntity<String> customHeader() {
return ResponseEntity.ok()
.header("X-Custom-Header", "MiValorPersonalizado")
.body("Header agregado exitosamente");
}