Annotazioni Spring @RequestParam vs @PathVariable

1. Panoramica

In questo breve tutorial, esploreremo le differenze tra le annotazioni @RequestParam e @PathVariable di Spring .

@RequestParam e @PathVariable possono essere utilizzati entrambi per estrarre valori dall'URI della richiesta, ma sono leggermente diversi.

2. Parametro query vs percorso URI

Mentre @RequestParam s estrae i valori dalla stringa di query, @PathVariables estrae i valori dal percorso URI:

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

Quindi, possiamo mappare in base al percorso:

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

E per @RequestParam, sarà:

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

Il che ci darebbe la stessa risposta, solo un URI diverso:

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

3. Valore codificato vs valore esatto

Poiché @PathVariable estrae i valori dal percorso dell'URI, non è codificato. D'altra parte, @RequestParam lo è.

Utilizzando l'esempio precedente, ab + c tornerà così com'è:

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

Ma per una richiesta @RequestParam , il parametro è l'URL decodificato:

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

4. Valori opzionali

Sia @RequestParam che @PathVariable possono essere facoltativi.

Possiamo rendere @PathVariable opzionale utilizzando l' attributo richiesto a partire da Spring 4.3.3:

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

Che, quindi, possiamo fare:

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

o:

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

Per @RequestParam , possiamo anche utilizzare l' attributo richiesto .

Nota che dovremmo fare attenzione quando rendiamo @PathVariable opzionale, per evitare conflitti nei percorsi.

5. conclusione

In questo articolo abbiamo appreso le differenze tra @RequestParam e @PathVariable .

Il codice sorgente completo per gli esempi può essere trovato su GitHub.