[Spring Tip] Differenza tra @RequestParam e @PathVariable

Dubbio piuttosto comune quando si comincia a lavorare con Spring MVC…

Che differenza c’è tra le annotazioni @RequestParam e @PathVariable?

Ve lo spiego subito! :-)

Parametri della richiesta

L’annotazione @RequestParam permette di sfruttare il data binding di Spring MVC per associare un parametro della richiesta HTTP ad un corrispondente parametro dell’handler method.

Supponiamo di aver dichiarato nel nostro Controller un metodo di questo tipo:

@PostMapping("/users")
public String newUser(@RequestParam("name") String userName){
  // ...
}

In questo esempio abbiamo associato il parametro userName del metodo al parametro name inviato nel payload della POST. Questa associazione fa sì che la variabile userName riceva come argomento il valore del corrispondente parametro della richiesta HTTP.

[Leggi anche: Utilizzare le annotazioni @RequestParam e @RequestHeader di Spring MVC]

URI template e placeholder

Il mapping delle richieste HTTP, in Spring MVC, avviene utilizzando l’annotazione @RequestMapping (o una delle sue specializzazioni: @GetMapping, @PostMapping, ecc.), che consente di specificare un URI template. L’URI template rappresenta il formato dei path che saranno gestiti dal metodo annotato.

Il template può contenere dei placeholder che, all’occorrenza, possono essere associati ai parametri dell’handler method, proprio attraverso l’annotazione @PathVariable.

@GetMapping("/users/{userId}")
public String getUser(@PathVariable("userId") String id){
  // ...
}

Il metodo riportato nell’esempio gestirà le richieste di tipo GET dirette a path con formato /users/{userId}. Il placeholder {userId}, consente di recuperare il valore presente nell’URL e di assegnarlo) al parametro stringa id.

[Leggi anche: Mapping delle richieste HTTP in Spring MVC]

In conclusione

Tutto chiaro?

Come avete visto, entrambe le annotazioni ci permettono, in un certo senso, di recuperare informazioni dalla richiesta HTTP.

Sintetizzando ulteriormente:

  • @PathVariable ci permette di recuperare valori inclusi nell’URI associato alla richiesta;

  • @RequestParam ci è utile per accedere ai parametri presenti nel corpo della richiesta (o nella query string, nel caso di richieste di tipo GET).

Alla prossima,

David