1 – Introduzione
Ci sono molti modi per implementare client Rest in java ma a mio avviso RestTemplate di Spring e’ sicuramente il migliore! Per chi non conoscesse questa libreria RestTemplate e’ un client Rest offerto dal modulo spring-web di Spring il quale mette a disposizione dei metodi per “consumare” dati rest.
NOTA: Il presente articolo da’ per scontato che il lettore sappia come funziona l’architettura RESTful pertanto non mi soffermero’ sui concetti di tale architettura.
2 – Ottenere dati da un web service Rest
In questo paragrafo mostrero’ come ottenere dati utilizzando API di un Web server RESTful di diverso verbo ( GET, PUT, POST, DELETE).
Inanzitutto iniziamo col dire di importare la dipendenza
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
NB: se stai utilizzando la dipendenza di springboot spring-boot-starter-web questo non e’ necessario poiche’ il kit di starter contiene anche RestTemplate
2-1 Client Rest di un api di verbo GET
Partiamo implementando un client rest che effettua una semplice richiesta GET all’url
URL/public/api/hello
il quale risponde per puro scopo di test con una risorsa di HelloMessage con un json strutturato in questo modo
{ "message": "Ciao" }
RestTemplate ti permette di effettuare la richiesta e di convertire automaticamente il json ricevuto in un oggetto Java strutturato in maniera conforme al json atteso; ovvero occorre in tal caso creare una classe java che abbia tutti i campi previsti dal json. Nel nostro esempio ho creato una classe HelloMessage.java la quale mi rappresenta la risposta del web server.
public class HelloMessage { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public HelloMessage(String message){ this.message = message; } public HelloMessage(){} @Override public String toString() { return "HelloMessage{" + "message='" + message + '\'' + '}'; } }
NB: Non dimenticarti il costruttore vuoto il quale e’ utilizzato da jackson in fase di deserializzazione del json.
A questo punto per ottenere dal web service la risposta bastano pochi statement:
RestTemplate restTemplate = new RestTemplate(); HelloMessage response1 = restTemplate.getForObject("http://localhost:8080/public/api/hello", HelloMessage.class);
Due istruzioni e il gioco e’ fatto: in response1 verra’ salvata la risposta del WS.
Come secondo esempio supponiamo di voler utilizzare una API rest GET la quale si aspetta nella richiesta dei parametri ad esempio un parametro nome .. in breve vogliamo effettuare una richiesta get all url
URL/public/api/hello?name=dario
Approfittiamo di questo esempio per mostrare come configurare uno o piu header alla richiesta rest ( in questo esempio configuro l’header della mia richiesta aggiungendo l’header Content-Type: application/json)
HttpHeaders headers = new HttpHeaders(); headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/public/api/helloPath") .queryParam("name", "dario"); HttpEntity<?> entity = new HttpEntity<>(headers); HttpEntity<HelloMessage> response2 = restTemplate.exchange( builder.build().encode().toUri(), HttpMethod.GET, entity, HelloMessage.class);
Il metodo exchange si presenta come funzionalita’ generica per effettuare richieste REST dando maggiore flessibilita’ e configurabilita’:
- supporto per ogni tipologia di metodo rest
- configurazione header da usare nella richiesta
- configurazione url con eventuali variabili nel path o parametri.
La risposta della richiesta rest generate dal metodo exchange potrà essere recuperata dal body della http entity:
response2.getBody()