CodeGym /Cursos /Módulo 5. Spring /Trabajo con solicitudes: @PathVariable, @RequestParam

Trabajo con solicitudes: @PathVariable, @RequestParam

Módulo 5. Spring
Nivel 7 , Lección 3
Disponible

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 @PathVariable enlaza 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 userId para 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 @RequestParam extrae valores desde la cadena de consulta.
  • El campo category es obligatorio, y para sort hemos puesto un valor por defecto price-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:

  1. Si indicas un nombre de variable incorrecto en la ruta (/{id}) y en la anotación (@PathVariable("userId")), Spring lanzará una excepción.
  2. 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.
  3. Un tipo de dato incorrecto (por ejemplo, intentar pasar una cadena donde se espera un Long) provocará una excepción HttpMessageNotReadableException.

Cómo corregir errores

  • Usa los mismos nombres para las variables en la ruta y en las anotaciones.
  • Recuerda que para @RequestParam puedes especificar un valor por defecto con defaultValue.
  • Presta atención a los tipos de datos: si esperas un Long y 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.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION