Haal en plaats lijsten met objecten met RestTemplate

1. Inleiding

De RestTemplate class is de centrale tool voor het uitvoeren van client-side HTTP-bewerkingen in Spring. Het biedt verschillende hulpprogramma's voor het bouwen van HTTP-verzoeken en het afhandelen van antwoorden.

En sindsdien RestTemplate integreert goed met Jackson, het kan de meeste objecten zonder veel moeite serialiseren / deserialiseren van en naar JSON. Echter, het werken met verzamelingen objecten is niet zo eenvoudig.

In deze zelfstudie zullen we zien hoe u RestTemplate aan beide KRIJGEN en POST een lijst met objecten.

2. Voorbeeldservice

We zullen een werknemers-API gebruiken die twee HTTP-eindpunten heeft - haal alles op en maak:

  • GET / medewerkers
  • POST / medewerkers

Voor communicatie tussen client en server gebruiken we een eenvoudige DTO om basisgegevens van werknemers in te kapselen:

openbare klasse Medewerker {openbare lange id; openbare String-titel; // standaard constructor en setters / getters}

We zijn nu klaar om code te schrijven die gebruikmaakt van RestTemplate om lijsten met Werknemer voorwerpen.

3. Haal een lijst met objecten op met RestTemplate

Normaal gesproken kunt u bij het aanroepen van GET een van de vereenvoudigde methoden gebruiken in RestTemplate, zoals:

getForObject (URI url, Class responseType)

Dit verzendt een verzoek naar de opgegeven URI met behulp van het GET-werkwoord en converteert de antwoordtekst naar het gevraagde Java-type. Dit werkt prima voor de meeste klassen, maar het heeft een beperking: we kunnen geen lijsten met objecten verzenden.

Het probleem is te wijten aan het wissen van typen met Java-generieke geneesmiddelen. Wanneer de toepassing actief is, weet deze niet welk type object in de lijst staat. Dit betekent dat de gegevens in de lijst niet kunnen worden gedeserialiseerd naar het juiste type.

Gelukkig hebben we twee opties om dit te omzeilen.

3.1. Arrays gebruiken

Ten eerste kunnen we gebruiken RestTemplate.getForEntity () om een ​​reeks objecten te KRIJGEN via de responseType parameter. Wat dan ook klasse we specificeren daar zal overeenkomen ResponseEntity‘S parametertype:

ResponseEntity response = restTemplate.getForEntity ("// localhost: 8080 / workers /", Employee []. Class); Werknemer [] werknemers = response.getBody ();

Verder hadden we kunnen gebruiken RestTemplate.exchange om hetzelfde resultaat te bereiken.

Merk op dat de medewerker hier het zware werk doet Reactie Extractor, dus als we verder maatwerk nodig hebben, kunnen we bellen uitvoeren en zorgen voor onze eigen instantie.

3.2. Met behulp van een wrapper-klasse

Sommige API's retourneren een object op het hoogste niveau dat de lijst met werknemers bevat in plaats van de lijst rechtstreeks te retourneren. Om met deze situatie om te gaan, kunnen we een wrapper-klasse gebruiken die de lijst met medewerkers bevat.

openbare klasse EmployeeList {privélijst werknemers; openbare EmployeeList () {werknemers = nieuwe ArrayList (); } // standard constructor en getter / setter}

Nu kunnen we de eenvoudiger gebruiken getForObject () methode om de lijst met werknemers te krijgen:

EmployeeList response = restTemplate.getForObject ("// localhost: 8080 / workers", EmployeeList.class); Lijst werknemers = response.getEmployees ();

Deze code is veel eenvoudiger, maar vereist een extra wrapper-object.

4. Post een lijst met objecten met RestTemplate

Laten we nu eens kijken hoe we een lijst met objecten van onze client naar de server kunnen sturen. Net als hierboven, RestTemplate biedt een vereenvoudigde methode voor het aanroepen van POST:

postForObject (URI url, objectverzoek, klasse responseType)

Dit verzendt een HTTP POST naar de opgegeven URI, met de optionele hoofdtekst van het verzoek, en converteert het antwoord naar het opgegeven type. In tegenstelling tot het bovenstaande GET-scenario, we hoeven ons geen zorgen te maken over het wissen van typen.

Dit komt omdat we nu van Java-objecten naar JSON gaan. De lijst met objecten en hun type zijn bekend bij de JVM en zijn daarom correct geserialiseerd:

Lijst newEmployees = nieuwe ArrayList (); newEmployees.add (nieuwe werknemer (3, "Stagiair")); newEmployees.add (nieuwe medewerker (4, "CEO")); restTemplate.postForObject ("// localhost: 8080 / workers /", newEmployees, ResponseEntity.class);

4.1. Met behulp van een wrapper-klasse

Als we een wrapper-klasse moeten gebruiken om consistent te zijn met het bovenstaande GET-scenario, is dat ook eenvoudig. We kunnen een nieuwe lijst sturen met RestTemplate:

Lijst newEmployees = nieuwe ArrayList (); newEmployees.add (nieuwe medewerker (3, "Stagiair")); newEmployees.add (nieuwe medewerker (4, "CEO")); restTemplate.postForObject ("// localhost: 8080 / workers", nieuwe EmployeeList (newEmployees), ResponseEntity.class);

5. Conclusie

Het gebruik van RestTemplate is een eenvoudige manier om HTTP-clients te bouwen om met uw services te communiceren.

Het biedt een aantal methoden om met elke HTTP-methode en eenvoudige objecten te werken. Met een klein beetje extra code kunnen we het gemakkelijk gebruiken om met lijsten met objecten te werken.

Zoals gewoonlijk is de volledige code beschikbaar in het Github-project.