Annotations Spring @RequestParam vs @PathVariable

1. Vue d'ensemble

Dans ce tutoriel rapide, nous explorerons les différences entre les annotations @RequestParam et @PathVariable de Spring .

@RequestParam et @PathVariable peuvent tous deux être utilisés pour extraire des valeurs de l'URI de la requête, mais ils sont un peu différents.

2. Paramètre de requête et chemin URI

Alors que @RequestParam extrait les valeurs de la chaîne de requête, @PathVariables extrait les valeurs du chemin URI:

@GetMapping("/foos/{id}") @ResponseBody public String getFooById(@PathVariable String id) { return "ID: " + id; }

Ensuite, nous pouvons mapper en fonction du chemin:

//localhost:8080/foos/abc ---- ID: abc

Et pour @RequestParam, ce sera:

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

Ce qui nous donnerait la même réponse, juste un URI différent:

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

3. Valeur encodée ou exacte

Étant donné que @PathVariable extrait des valeurs du chemin URI, il n'est pas codé. D'autre part, @RequestParam est.

En utilisant l'exemple précédent, ab + c retournera tel quel:

//localhost:8080/foos/ab+c ---- ID: ab+c

Mais pour une requête @RequestParam , le paramètre est décodé en URL:

//localhost:8080/foos?id=ab+c ---- ID: ab c

4. Valeurs facultatives

Les deux @RequestParam et @PathVariable peuvent être en option.

Nous pouvons rendre @PathVariable facultatif en utilisant l' attribut requis à partir de Spring 4.3.3:

@GetMapping({"/myfoos/optional", "/myfoos/optional/{id}"}) @ResponseBody public String getFooByOptionalId(@PathVariable(required = false) String id){ return "ID: " + id; }

Ce que nous pouvons alors faire soit:

//localhost:8080/myfoos/optional/abc ---- ID: abc 

ou:

//localhost:8080/myfoos/optional ---- ID: null

Pour @RequestParam , nous pouvons également utiliser l' attribut requis .

Notez que nous devons être prudents en rendant @PathVariable facultatif, pour éviter les conflits dans les chemins.

5. Conclusion

Dans cet article, nous avons appris les différences entre @RequestParam et @PathVariable .

Le code source complet des exemples est disponible à l'adresse over sur GitHub.