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.