Ahora pasamos a una parte importante del trabajo con solicitudes: sus parámetros. En esta lección veremos cómo extraer valores desde la URL (path variables) y cómo manejar los parámetros de la solicitud (request parameters). Estos dos métodos son la base para crear aplicaciones web flexibles y funcionales.
Qué son los parámetros de la solicitud y para qué sirven
Cuando un usuario envía una petición al servidor (por ejemplo, para buscar un artículo concreto o el perfil de un usuario), puede enviar datos con la solicitud. Esos datos pueden ser parte de la URL o pasarse como parámetros en la cadena de consulta (query string). Spring MVC ofrece una forma sencilla y potente de extraer esos datos usando las anotaciones @PathVariable y @RequestParam.
¿Pero para qué sirve esto? Pues imagina que en vez de dar una respuesta genérica como "todos los artículos", quieres mostrar el artículo con un identificador concreto (por ejemplo, /articles/42). O, por ejemplo, buscar productos por categoría con un filtro determinado (por ejemplo, /products?category=books&sort=price-desc). En ambos casos tienes que procesar los parámetros de la solicitud para ofrecer al usuario los datos que necesita.
Procesar variables en la ruta: la anotación @PathVariable
Empecemos con @PathVariable. Esta anotación se usa para extraer valores directamente del URI (URL). Te permite definir partes dinámicas de la ruta de forma flexible.
Ejemplo de uso
Supongamos que quieres mostrar el perfil de un usuario por su ID. La URL podría ser: /users/123. Aquí 123 es el valor de la variable de ruta.
Ejemplo de código:
@RestController
@RequestMapping("/users")
public class UserController {
// Procesa la solicitud tipo /users/123
@GetMapping("/{id}")
public String getUserById(@PathVariable("id") Long userId) {
// Aquí podemos usar userId para buscar al usuario
return "Usuario con ID: " + userId;
}
}
Puntos clave:
- La anotación
@PathVariableenlaza el valor desde la URL con una variable en el método. - En la ruta indicamos la parte dinámica:
{id}. - En el método del controlador usamos la variable
userIdpara procesar la petición.
Al solicitar GET /users/123 el servidor devolverá: Usuario con ID: 123.
Un ejemplo un poco más complejo
Puedes usar varias variables en la ruta:
@RestController
@RequestMapping("/articles")
public class ArticleController {
@GetMapping("/{category}/{id}")
public String getArticleByCategoryAndId(@PathVariable String category, @PathVariable Long id) {
return "Artículo de la categoría '" + category + "' con ID: " + id;
}
}
Ahora la petición GET /articles/tech/42 devolverá: Artículo de la categoría 'tech' con ID: 42.
Cómo llegan los parámetros en la petición: la anotación @RequestParam
Si necesitas extraer datos desde la cadena de consulta (query string), utiliza la anotación @RequestParam. Los parámetros se pasan en la URL después del signo ? en el formato clave=valor. Por ejemplo, /products?category=books.
Ejemplo de uso
Vamos a crear un método para buscar productos:
@RestController
@RequestMapping("/products")
public class ProductController {
@GetMapping("/search")
public String searchProducts(@RequestParam String category, @RequestParam(defaultValue = "price-asc") String sort) {
return "Búsqueda de productos en la categoría: " + category + ", orden: " + sort;
}
}
Ahora la petición GET /products/search?category=electronics&sort=price-desc devolverá: Búsqueda de productos en la categoría: electronics, orden: price-desc.
Puntos clave:
- La anotación
@RequestParamextrae valores desde la cadena de consulta. - El campo
categoryes obligatorio, y parasorthemos puesto un valor por defectoprice-asc.
Manejo de parámetros opcionales
Puedes hacer que algunos parámetros sean opcionales:
@RestController
@RequestMapping("/products")
public class OptionalParamController {
@GetMapping("/filter")
public String filterProducts(@RequestParam(required = false) String category) {
if (category == null) {
return "¡Por favor, selecciona una categoría!";
}
return "Filtrando productos por categoría: " + category;
}
}
Si la petición llega sin el parámetro category, la aplicación manejará la situación correctamente y devolverá: ¡Por favor, selecciona una categoría!.
Comparación entre @PathVariable y @RequestParam
| Característica | @PathVariable | @RequestParam |
|---|---|---|
| Fuente de datos | Ruta URL | Cadena de consulta (query string) |
| Ejemplo | /users/123 |
/search?category=books |
| Anotación | @PathVariable("nombre") |
@RequestParam("nombre") |
| Obligatoriedad | Normalmente un parámetro obligatorio | Puedes indicar que sea opcional |
| Uso | Recursos únicos (por ejemplo, ID) | Filtros, ordenación, parámetros adicionales |
Ejemplo: combinación de @PathVariable y @RequestParam
Veamos un ejemplo donde usamos ambas anotaciones:
@RestController
@RequestMapping("/orders")
public class OrderController {
@GetMapping("/{orderId}")
public String getOrderDetails(@PathVariable Long orderId,
@RequestParam(required = false) String includeDetails) {
if ("true".equals(includeDetails)) {
return "Detalles del pedido con ID: " + orderId + ". Información: [detalles del pedido]";
}
return "Pedido con ID: " + orderId;
}
}
La petición GET /orders/99?includeDetails=true devolverá: Detalles del pedido con ID: 99. Información: [detalles del pedido].
La petición GET /orders/99 devolverá: Pedido con ID: 99.
Errores típicos
Los errores al usar @PathVariable y @RequestParam suelen deberse a nombres de variables que no coinciden, falta de valores, ajustes incorrectos de obligatoriedad o tipos incorrectos.
Por ejemplo:
- Si indicas un nombre de variable incorrecto en la ruta (
/{id}) y en la anotación (@PathVariable("userId")), Spring lanzará una excepción. - Si un parámetro de la consulta se marca como obligatorio pero el cliente no lo envía, se producirá un error
400 Bad Request. - Un tipo de dato incorrecto (por ejemplo, intentar pasar una cadena donde se espera un
Long) provocará una excepciónHttpMessageNotReadableException.
Cómo corregir errores
- Usa los mismos nombres para las variables en la ruta y en las anotaciones.
- Recuerda que para
@RequestParampuedes especificar un valor por defecto condefaultValue. - Presta atención a los tipos de datos: si esperas un
Longy se pasa una cadena, eso va a fallar.
Ahora estás equipado con el conocimiento de cómo trabajar con los parámetros de las solicitudes en Spring MVC. Esto te abre muchas posibilidades para crear rutas flexibles y manejar solicitudes web complejas. En las próximas lecciones aprenderás validación de datos al trabajar con solicitudes y verás cómo Spring MVC ayuda a evitar errores comunes.
GO TO FULL VERSION