Annotation Spring @RequestParam

1. Vue d'ensemble

Dans ce tutoriel rapide, nous explorerons l' annotation @RequestParam de Spring et ses attributs.

En termes simples, nous pouvons utiliser @RequestParam pour extraire les paramètres de requête, les paramètres de formulaire et même les fichiers de la requête.

2. Une cartographie simple

Disons que nous avons un point de terminaison / api / foos qui prend un paramètre de requête appelé id :

@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam String id) { return "ID: " + id; }

Dans cet exemple, nous avons utilisé @RequestParam pour extraire le paramètre de requête id .

Une simple requête GET invoquerait getFoos :

//localhost:8080/api/foos?id=abc ---- ID: abc

Ensuite, examinons les attributs de l'annotation: nom , valeur , obligatoire et valeur par défaut .

3. Spécification du nom du paramètre de demande

Dans l'exemple précédent, le nom de la variable et le nom du paramètre sont identiques.

Cependant, nous voulons parfois que ce soit différent. Ou, si nous n'utilisons pas Spring Boot, nous pouvons avoir besoin de faire une configuration spéciale au moment de la compilation ou les noms de paramètres ne seront pas réellement dans le bytecode.

Heureusement, nous pouvons configurer le nom @RequestParam en utilisant l' attribut name :

@PostMapping("/api/foos") @ResponseBody public String addFoo(@RequestParam(name = "id") String fooId, @RequestParam String name) { return "ID: " + fooId + " Name: " + name; }

Nous pouvons également faire @RequestParam (valeur = "id") ou simplement @RequestParam ("id").

4. Paramètres de demande facultatifs

Les paramètres de méthode annotés avec @RequestParam sont obligatoires par défaut.

Cela signifie que si le paramètre n'est pas présent dans la requête, nous obtiendrons une erreur:

GET /api/foos HTTP/1.1 ----- 400 Bad Request Required String parameter 'id' is not present

Nous pouvons cependant configurer notre @RequestParam pour être facultatif, avec l' attribut requis :

@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam(required = false) String id) { return "ID: " + id; }

Dans ce cas, les deux:

//localhost:8080/api/foos?id=abc ---- ID: abc

et

//localhost:8080/api/foos ---- ID: null

invoquera correctement la méthode.

Lorsque le paramètre n'est pas spécifié, le paramètre de méthode est lié à null .

4.1. Utilisation de Java 8 en option

Alternativement, nous pouvons envelopper le paramètre en facultatif :

@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam Optional id){ return "ID: " + id.orElseGet(() -> "not provided"); }

Dans ce cas, nous n'avons pas besoin de spécifier l' attribut requis .

Et la valeur par défaut sera utilisée si le paramètre de requête n'est pas fourni:

//localhost:8080/api/foos ---- ID: not provided

5. Une valeur par défaut pour le paramètre de demande

Nous pouvons également définir une valeur par défaut sur @RequestParam en utilisant l' attribut defaultValue :

@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam(defaultValue = "test") String id) { return "ID: " + id; }

C'est comme required = false, en ce que l'utilisateur n'a plus besoin de fournir le paramètre :

//localhost:8080/api/foos ---- ID: test

Bien que nous soyons toujours en mesure de le fournir:

//localhost:8080/api/foos?id=abc ---- ID: abc

Notez que lorsque nous définissons l' attribut defaultValue , required est en effet défini sur false .

6. Mappage de tous les paramètres

Nous pouvons également avoir plusieurs paramètres sans définir leurs noms ou leur nombre en utilisant simplement une carte :

@PostMapping("/api/foos") @ResponseBody public String updateFoos(@RequestParam Map allParams) { return "Parameters are " + allParams.entrySet(); }

qui reflétera alors tous les paramètres envoyés:

curl -X POST -F 'name=abc' -F 'id=123' //localhost:8080/api/foos ----- Parameters are {[name=abc], [id=123]}

7. Mappage d'un paramètre à valeurs multiples

Un seul @RequestParam peut avoir plusieurs valeurs:

@GetMapping("/api/foos") @ResponseBody public String getFoos(@RequestParam List id) { return "IDs are " + id; }

Et Spring MVC mappera un paramètre d' ID délimité par des virgules :

//localhost:8080/api/foos?id=1,2,3 ---- IDs are [1,2,3]

ou une liste de paramètres d' id séparés :

//localhost:8080/api/foos?id=1&id=2 ---- IDs are [1,2]

8. Conclusion

Dans cet article, nous avons appris à utiliser @RequestParam.

Le code source complet des exemples se trouve dans le projet GitHub.