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:

Ciao Mondo!

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