La anotación @RequestParam permite que Spring extraiga datos de entrada que se pueden pasar como una consulta, datos de formulario o cualquier dato personalizado arbitrario. Aquí, veremos cómo podemos usar @RequestParam al crear API RESTful para una aplicación basada en web.
Contexto de la aplicación: supongamos que estamos implementando una característica de muestra para la aplicación web ‘Geeksforgeeks’, donde los usuarios podrán publicar y recuperar temas de artículos disponibles para escribir artículos sobre ellos. Aquí usaremos hashmaps como nuestra base de datos para simplificar. Usamos bloque estático para cargar la entrada predeterminada en nuestro hashmap/DB.
Ilustración:
static int ID = 1; // Using hashmaps instead of repository for simplicity public static Map<Integer, String> articleTopics = new HashMap(); static { articleTopics.put(0, "GFG"); }
Mapeo simple usando @RequestParam
Digamos que tenemos un punto final /api/v1/article que toma un parámetro de consulta articleId donde los usuarios podrán obtener el tema del artículo dada la identificación del artículo. Si el Id. del artículo dado no está presente, devolvemos «Artículo no aceptado» como respuesta con 404 Bad Request como estado.
Ejemplo:
// Java Program to Illustrate Simple GET Mapping // Annotation @GetMapping("/api/v1/article") // Method public ResponseEntity<String> getArticleTopic(@RequestParam Integer articleId) { if (articleTopics.containsKey(articleId)) { return ResponseEntity.ok( articleId + " " + articleTopics.get(articleId)); } return ResponseEntity.badRequest().body( "Article doesnot exists"); }
Nota:
- Los bloques estáticos se ejecutan automáticamente cuando la clase se carga en la memoria.
- La anotación @GetMapping se usa para asignar requests HTTP GET para métodos de controlador específicos.
- ResponseEntity representa una respuesta HTTP que incluye encabezados, cuerpo y estado.
- Postman se utiliza para probar las API.
Cuando intentamos que el artículo ya estuviera presente en nuestra base de datos, obtenemos el cuerpo de respuesta requerido con ‘200 OK’ como código de estado.
Cuando intentamos que el artículo no esté presente en nuestra base de datos, obtenemos el cuerpo de respuesta «Artículo no presente» con 400 SOLICITUD INCORRECTA como código de estado.
Especificación del nombre del parámetro de solicitud mediante @RequestParam
Digamos que tenemos un punto final /api/v2/article para publicar temas de artículos que toma un parámetro de consulta articleName como name .
Ejemplo
// Specifying the request parameter name // Annotation @PostMapping("api/v2/article") public ResponseEntity<String> postArticleTopic(@RequestParam("name") String articleName) { if (articleTopics.containsValue(articleName)) { return ResponseEntity.badRequest().body("Article already exists"); } int currentArticleID = ID++; articleTopics.put(currentArticleID, articleName); return ResponseEntity.ok("Saved : [" + currentArticleID + "," + articleTopics.get(currentArticleID) + "]"); }
Cuando intentamos que el artículo no exista en nuestra base de datos, guardamos la solicitud y devolvemos una respuesta con 200 OK como código de estado.
Cuando intentamos que el artículo ya estuviera presente en nuestra base de datos, obtenemos el cuerpo de respuesta «El artículo ya existe» con 400 SOLICITUD INCORRECTA como código de estado.
Uso de @RequestParam con valor predeterminado
Digamos que tenemos un punto final /api/v3/article para obtener temas de artículos que toman un parámetro de consulta articleId. Aquí hemos utilizado el atributo defaultValue que toma el valor predeterminado si no se proporciona ningún valor.
Ejemplo:
// Default value for Request Parameters @GetMapping("/api/v3/article") public ResponseEntity<String> getArticleTopicOrDefault(@RequestParam(defaultValue = "0")Integer articleId) { if (!articleTopics.containsKey(articleId)) { // If the provided articleId is not present in Database, then also return default articleId = 0; } // If no value is provided for id then return default return ResponseEntity.ok(articleId + " " + articleTopics.get(articleId)); }
Si no se proporciona ningún valor para el parámetro de consulta, devuelva el valor predeterminado.
Si el valor proporcionado no existe en la base de datos, devuelva también el valor predeterminado.
Uso de @RequestParam para mapear parámetros de consulta de valores múltiples
Digamos que tenemos un punto final /api/v4/article para publicar temas de artículos que toma una lista como parámetro de consulta.
Ejemplo
// Mapping a multivalue parameter @PostMapping("/api/v4/article") public ResponseEntity<String> getMultipleArticleTopics(@RequestParam List<String> names) { for (String topic : names) { articleTopics.put(ID++, topic); } return ResponseEntity.accepted().body("Saved : " + names); }
Implementación:
Java
// Java Program to Illustrate Spring - MVC // RequestParam Annotation package com.example.springmvc.RequestParamAnnotation; // Importing required classes import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; // Annotation @RestController // Class public class Controller { static int ID = 1; // Using hashmaps instead of repository for simplicity public static Map<Integer, String> articleTopics = new HashMap(); static { articleTopics.put(0, "GFG"); } // Simple mapping @GetMapping("/api/v1/article") public ResponseEntity<String> getArticleTopic(@RequestParam Integer articleId) { // Searching in map if not found return null; if (articleTopics.containsKey(articleId)) { return ResponseEntity.ok( articleId + " " + articleTopics.get(articleId)); } return ResponseEntity.badRequest().body( "Article doesnot exists"); } // Specifying the request parameter name @PostMapping("api/v2/article") public ResponseEntity<String> postArticleTopic( @RequestParam("name") String articleName) { if (articleTopics.containsValue(articleName)) { return ResponseEntity.badRequest().body( "Article already exists"); } int currentArticleID = ID++; articleTopics.put(currentArticleID, articleName); return ResponseEntity.ok( "Saved : [" + currentArticleID + "," + articleTopics.get(currentArticleID) + "]"); } // Default value for Request Parameters @GetMapping("/api/v3/article") public ResponseEntity<String> getArticleTopicOrDefault( @RequestParam(defaultValue = "0") Integer articleId) { if (!articleTopics.containsKey(articleId)) { // If the provided articleId is not present in // DB, then also return default articleId = 0; } // If no value is provided for ID // then return default return ResponseEntity.ok( articleId + " " + articleTopics.get(articleId)); } // Mapping a multivalue Container r @PostMapping("/api/v4/article") public ResponseEntity<String> getMultipleArticleTopics( @RequestParam List<String> names) { for (String topic : names) { articleTopics.put(ID++, topic); } return ResponseEntity.accepted().body("Saved : " + names); } }
Nota: @RestController es una anotación de conveniencia utilizada para crear controladores Restful.
Dependencias: Gradle
dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'javax.validation:validation-api:2.0.1.Final' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' }