1. Información general
En este tutorial rápido, exploraremos la anotación @RequestParam de Spring y sus atributos.
En pocas palabras, podemos usar @RequestParam para extraer parámetros de consulta, parámetros de formulario e incluso archivos de la solicitud.
2. Un mapeo simple
Digamos que tenemos un endpoint / api / foos que toma un parámetro de consulta llamado id :
@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam String id) { return "ID: " + id; }
En este ejemplo, usamos @RequestParam para extraer el parámetro de consulta id .
Una simple solicitud GET invocaría getFoos :
//localhost:8080/api/foos?id=abc ---- ID: abc
A continuación, echemos un vistazo a los atributos de la anotación: nombre , valor , obligatorio y valor predeterminado .
3. Especificación del nombre del parámetro de solicitud
En el ejemplo anterior, tanto el nombre de la variable como el nombre del parámetro son iguales.
Sin embargo, a veces queremos que sean diferentes. O, si no estamos usando Spring Boot, es posible que necesitemos hacer una configuración especial en tiempo de compilación o los nombres de los parámetros no estarán en el código de bytes.
Afortunadamente, podemos configurar el nombre @RequestParam usando el atributo de nombre :
@PostMapping("/api/foos") @ResponseBody public String addFoo(@RequestParam(name = "id") String fooId, @RequestParam String name) { return "ID: " + fooId + " Name: " + name; }
También podemos hacer @RequestParam (value = "id") o simplemente @RequestParam ("id").
4. Parámetros de solicitud opcionales
Los parámetros del método anotados con @RequestParam son obligatorios de forma predeterminada.
Esto significa que si el parámetro no está presente en la solicitud, obtendremos un error:
GET /api/foos HTTP/1.1 ----- 400 Bad Request Required String parameter 'id' is not present
Sin embargo, podemos configurar nuestro @RequestParam para que sea opcional, con el atributo requerido :
@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam(required = false) String id) { return "ID: " + id; }
En este caso, ambos:
//localhost:8080/api/foos?id=abc ---- ID: abc
y
//localhost:8080/api/foos ---- ID: null
invocará correctamente el método.
Cuando no se especifica el parámetro, el parámetro del método está vinculado a nulo .
4.1. Uso de Java 8 opcional
Alternativamente, podemos envolver el parámetro en Opcional :
@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam Optional id){ return "ID: " + id.orElseGet(() -> "not provided"); }
En este caso, no necesitamos especificar el atributo requerido .
Y el valor predeterminado se utilizará si no se proporciona el parámetro de solicitud:
//localhost:8080/api/foos ---- ID: not provided
5. Un valor predeterminado para el parámetro de solicitud
También podemos establecer un valor predeterminado para @RequestParam usando el atributo defaultValue :
@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam(defaultValue = "test") String id) { return "ID: " + id; }
Esto es como required = false, en el sentido de que el usuario ya no necesita proporcionar el parámetro :
//localhost:8080/api/foos ---- ID: test
Aunque, todavía podemos proporcionarlo:
//localhost:8080/api/foos?id=abc ---- ID: abc
Tenga en cuenta que cuando establecemos el atributo defaultValue , required se establece en falso .
6. Asignación de todos los parámetros
También podemos tener múltiples parámetros sin definir sus nombres o contar con solo usar un Mapa :
@PostMapping("/api/foos") @ResponseBody public String updateFoos(@RequestParam Map allParams) { return "Parameters are " + allParams.entrySet(); }
que luego reflejará cualquier parámetro enviado:
curl -X POST -F 'name=abc' -F 'id=123' //localhost:8080/api/foos ----- Parameters are {[name=abc], [id=123]}
7. Asignación de un parámetro de valor múltiple
Un solo @RequestParam puede tener varios valores:
@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam List id) { return "IDs are " + id; }
Y Spring MVC mapeará un parámetro de identificación delimitado por comas :
//localhost:8080/api/foos?id=1,2,3 ---- IDs are [1,2,3]
o una lista de parámetros de identificación separados :
//localhost:8080/api/foos?id=1&id=2 ---- IDs are [1,2]
8. Conclusión
En este artículo, aprendimos cómo usar @RequestParam.
El código fuente completo de los ejemplos se puede encontrar en el proyecto GitHub.