Utilizzare le annotazioni @RequestParam e @RequestHeader di Spring MVC
In questo articolo vediamo come sia semplice recuperare parametri e header, inviati con una richiesta HTTP, utilizzando le annotazioni @RequestParam
e @RequestHeader
di Spring MVC.
Spring MVC lascia massima libertà per quel che riguarda la costruzione dei nostri Controller. In particolare, possiamo utilizzare la signature che riteniamo più opportuna, per i nostri handler method.
Come abbiamo visto quando abbiamo parlato del passaggio di dati alla View, alcuni parametri del metodo verranno iniettati a runtime in maniera “intelligente” (ad esempio Model
).
Per altri, invece, dovremo dare indicazioni più chiare al framework…
L’annotazione @RequestParam
Esaminiamo il seguente metodo:
@GetMapping("/")
public String unSaluto(@RequestParam("nome") String nome, Model model) {
model.addAttribute("nome", nome);
return "ciao-mondo";
}
Se ci fate caso, il parametro nome
del nostro esempio è preceduto da un’annotazione di cui non abbiamo ancora parlato: @RequestParam
. Quest’annotazione ci permette di associare un parametro della richiesta HTTP ad un corrispondente parametro dell’handler method.
Il nostro metodo unSaluto
è configurato per gestire richieste GET
, per cui il parametro nome
verrà recuperato dalla query string.
L’annotazione @RequestParam
presenta tre elementi; il principale, name
(alias di value
), serve ad esplicitare il nome del parametro della richiesta: nel nostro caso "nome"
. Se tale valore non viene dichiarato, Spring MVC utilizza il nome del parametro dichiarato nel metodo: nel nostro caso sempre nome
.
L’elemento booleano required
permette invece di indicare se il parametro è obbligatorio per la richiesta. In tal caso Spring MVC si aspetta che il corrispondente parametro dell’handler method sia valorizzato (non null); in caso contrario l’applicazione lancerà un’eccezione. I parametri annotati con @RequestParam
sono obbligatori di default.
Infine, defaultValue
è l’elemento che permette d’impostare un valore di default per il parametro annotato:
@RequestParam(name="nome", defaultValue="Tizio") String nome
Nel caso in cui il parametro nome
non sia presente nella richiesta, il valore "Tizio"
verrà assegnato all’omonimo parametro dell’hanlder.
Piccola nota Valorizzando defaultValue
, l’elemento required
dell’annotazione verrà implicitamente impostato a false
.
L’annotazione @RequestHeader
Così com’è possibile associare un parametro del nostro hanlder ad un corrispondente parametro della richiesta HTTP, è possibile “mappare” un header della richiesta ad un parametro
Analogamente a quanto visto per i parametri di una richiesta HTTP, Spring MVC permette di accedere agli header inviati dal client. Per farlo possiamo utilizzare l’annotazione @RequestHeader
:
@GetMapping("/")
public String unSaluto(
@RequestParam(name = "nome", defaultValue = "Tizio") String nome
, @RequestHeader("User-Agent") String userAgent
, Model model) {
model.addAttribute("nome", nome);
model.addAttribute("userAgent", userAgent);
return "ciao-mondo";
}
In questo modo possiamo ottenere saluti personalizzati e più dettagliati:
Fico, no? :-)
L’annotazione @RequestHeader
espone gli stessi elementi dichiarati da @RequestParam
e permette, dunque, di specificare header mandatori, o eventuali valori di default:
@RequestHeader(name="Optional-Header", required=false) String optHeader
Piccola nota Come visto per @RequestParam
, i parametri annotati con @RequestHeader
sono obbligatori di default.
In conclusione
Come visto in più di un’occasione, Spring MVC sfrutta le Java annotation in modo molto smart e le annotazioni @RequestParam
e @RequestHeader
sono l’ennesimo esempio di questo utilizzo efficace.
Dopo aver esaminato il passaggio dei dati dal Controller alla View e l’acquisizione dei dati di una request HTTP, il passo successivo è la gestione dei form… ma di questo parleremo in un altro post. ;-)
A presto,
David