Ottieni e pubblica elenchi di oggetti con RestTemplate

1. Introduzione

La classe RestTemplate è lo strumento centrale per eseguire operazioni HTTP lato client in primavera. Fornisce diversi metodi di utilità per la creazione di richieste HTTP e la gestione delle risposte.

E, poiché RestTemplate si integra bene con Jackson, può serializzare / deserializzare la maggior parte degli oggetti da e verso JSON senza troppi sforzi. Tuttavia, lavorare con raccolte di oggetti non è così semplice .

In questo tutorial, vedremo come utilizzare RestTemplate sia per GET che per POST un elenco di oggetti.

2. Servizio di esempio

Useremo un'API dipendente che ha due endpoint HTTP: prendi tutto e crea:

  • GET / dipendenti
  • POST / dipendenti

Per la comunicazione tra client e server, utilizzeremo un semplice DTO per incapsulare i dati di base dei dipendenti:

public class Employee { public long id; public String title; // standard constructor and setters/getters }

Ora siamo pronti per scrivere codice che usa RestTemplate per ottenere e creare elenchi di oggetti Employee .

3. Ottieni un elenco di oggetti con RestTemplate

Normalmente quando si chiama GET, è possibile utilizzare uno dei metodi semplificati in RestTemplate , ad esempio :

getForObject (URL URI, classe responseType)

Questo invia una richiesta all'URI specificato utilizzando il verbo GET e converte il corpo della risposta nel tipo Java richiesto. Funziona alla grande per la maggior parte delle classi, ma ha una limitazione: non possiamo inviare elenchi di oggetti.

Il problema è dovuto alla cancellazione del tipo con generici Java. Quando l'applicazione è in esecuzione, non è a conoscenza del tipo di oggetto presente nell'elenco. Ciò significa che i dati nell'elenco non possono essere deserializzati nel tipo appropriato.

Fortunatamente abbiamo due opzioni per aggirare questo problema.

3.1. Utilizzo di array

Innanzitutto, possiamo usare RestTemplate. getForEntity () per OTTENERE un array di oggetti tramite il parametro responseType . Qualunque sia la classe che specifichiamo, corrisponderà al tipo di parametro di ResponseEntity :

ResponseEntity response = restTemplate.getForEntity( "//localhost:8080/employees/", Employee[].class); Employee[] employees = response.getBody();

Inoltre, avremmo potuto utilizzare RestTemplate.exchange per ottenere lo stesso risultato.

Nota che il collaboratore che fa il lavoro pesante qui è ResponseExtractor, quindi se abbiamo bisogno di ulteriori personalizzazioni, possiamo chiamare execute e fornire la nostra istanza.

3.2. Utilizzo di una classe wrapper

Alcune API restituiranno un oggetto di primo livello che contiene l'elenco dei dipendenti invece di restituire l'elenco direttamente. Per gestire questa situazione, possiamo utilizzare una classe wrapper che contiene l'elenco dei dipendenti.

public class EmployeeList { private List employees; public EmployeeList() { employees = new ArrayList(); } // standard constructor and getter/setter }

Ora possiamo utilizzare il metodo getForObject () più semplice per ottenere l'elenco dei dipendenti:

EmployeeList response = restTemplate.getForObject( "//localhost:8080/employees", EmployeeList.class); List employees = response.getEmployees();

Questo codice è molto più semplice ma richiede un oggetto wrapper aggiuntivo.

4. Registrare un elenco di oggetti con RestTemplate

Ora vediamo come inviare un elenco di oggetti dal nostro client al server. Proprio come sopra, RestTemplate fornisce un metodo semplificato per chiamare POST:

postForObject (URL URI, richiesta oggetto, classe responseType)

Questo invia un HTTP POST all'URI specificato, con il corpo della richiesta facoltativo, e converte la risposta nel tipo specificato. A differenza dello scenario GET sopra, non dobbiamo preoccuparci della cancellazione del tipo .

Questo perché ora stiamo passando dagli oggetti Java a JSON. L'elenco degli oggetti e il loro tipo sono conosciuti dalla JVM, e quindi devono essere opportunamente serializzati:

List newEmployees = new ArrayList(); newEmployees.add(new Employee(3, "Intern")); newEmployees.add(new Employee(4, "CEO")); restTemplate.postForObject( "//localhost:8080/employees/", newEmployees, ResponseEntity.class);

4.1. Utilizzo di una classe wrapper

Se abbiamo bisogno di usare una classe wrapper per essere coerenti con lo scenario GET sopra, anche questo è semplice. Possiamo inviare un nuovo elenco utilizzando RestTemplate :

List newEmployees = new ArrayList(); newEmployees.add(new Employee(3, "Intern")); newEmployees.add(new Employee(4, "CEO")); restTemplate.postForObject( "//localhost:8080/employees", new EmployeeList(newEmployees), ResponseEntity.class);

5. conclusione

L'utilizzo di RestTemplate è un modo semplice per creare client HTTP per comunicare con i tuoi servizi.

Fornisce una serie di metodi per lavorare con ogni metodo HTTP e oggetti semplici. Con un po 'di codice extra, possiamo usarlo facilmente per lavorare con elenchi di oggetti.

Come al solito, il codice completo è disponibile nel progetto Github.