Hent og post lister over objekter med RestTemplate

1. Introduktion

Det RestTemplate klasse er det centrale værktøj til at udføre HTTP-operationer på klientsiden i foråret. Det giver flere hjælpemetoder til opbygning af HTTP-anmodninger og håndtering af svar.

Og siden RestTemplate integreres godt med Jackson, kan den serieisere / deserialisere de fleste objekter til og fra JSON uden megen anstrengelse. Imidlertid, at arbejde med objektsamlinger er ikke så ligetil.

I denne vejledning ser vi, hvordan du bruger RestTemplate til begge og STOLPE en liste over objekter.

2. Eksempel på service

Vi bruger en medarbejder-API, der har to HTTP-slutpunkter - hent alt og opret:

  • FÅ / medarbejdere
  • POST / medarbejdere

Til kommunikation mellem klient og server bruger vi en simpel DTO til at indkapsle grundlæggende medarbejderdata:

offentlig klassemedarbejder {offentlig lang id; offentlig streng titel; // standard konstruktør og settere / getters}

Vi er nu klar til at skrive kode, der bruger RestTemplate at hente og oprette lister over Medarbejder genstande.

3. Få en liste over objekter med RestTemplate

Normalt når du ringer til GET, kan du bruge en af ​​de forenklede metoder i RestTemplate, såsom:

getForObject (URI url, Class responseType)

Dette sender en anmodning til den angivne URI ved hjælp af GET-verbet og konverterer responsorganet til den anmodede Java-type. Dette fungerer godt for de fleste klasser, men det har en begrænsning: vi kan ikke sende lister over objekter.

Problemet skyldes sletning af typer med Java generics. Når applikationen kører, har den ingen viden om, hvilken type objekt der er på listen. Dette betyder, at dataene på listen ikke kan deserialiseres til den relevante type.

Heldigvis har vi to muligheder for at komme omkring dette.

3.1. Brug af arrays

Først kan vi bruge RestTemplate.getForEntity () for at FÅ en række objekter via responsType parameter. Uanset hvad klasse vi angiver, at der vil matche SvarEnhed'S parametertype:

ResponseEntity respons = restTemplate.getForEntity ("// localhost: 8080 / ansatte /", Medarbejder []. Klasse); Medarbejder [] medarbejdere = respons.getBody ();

Yderligere kunne vi have brugt RestTemplate.exchange for at opnå det samme resultat.

Bemærk, at samarbejdspartneren, der gør det tunge løft her, er Svar Extractor, så hvis vi har brug for yderligere tilpasning, kan vi ringe udføre og give vores egen instans.

3.2. Brug af en indpakningsklasse

Nogle API'er returnerer et topniveauobjekt, der indeholder listen over medarbejdere i stedet for at returnere listen direkte. For at håndtere denne situation kan vi bruge en indpakningsklasse, der indeholder listen over medarbejdere.

offentlig klasse EmployeeList {private List medarbejdere; offentlig EmployeeList () {medarbejdere = ny ArrayList (); } // standardkonstruktør og getter / setter}

Nu kan vi bruge det enklere getForObject () metode til at få listen over medarbejdere:

EmployeeList response = restTemplate.getForObject ("// localhost: 8080 / ansatte", EmployeeList.class); Liste medarbejdere = respons.getEmployees ();

Denne kode er meget enklere, men kræver et ekstra indpakningsobjekt.

4. Opret en liste over objekter med RestTemplate

Lad os nu se på, hvordan du sender en liste over objekter fra vores klient til serveren. Ligesom ovenfor, RestTemplate giver en forenklet metode til at ringe til POST:

postForObject (URI url, Objektanmodning, Class responseType)

Dette sender en HTTP POST til den givne URI med det valgfri anmodningsorgan og konverterer svaret til den angivne type. I modsætning til GET-scenariet ovenfor, vi behøver ikke bekymre os om sletning af typen.

Dette skyldes, at vi nu går fra Java-objekter til JSON. Listen over objekter og deres type er kendt af JVM og serieres derfor korrekt:

Liste over nye medarbejdere = ny ArrayList (); newEmployees.add (ny medarbejder (3, "praktikant")); newEmployees.add (ny medarbejder (4, "CEO")); restTemplate.postForObject ("// localhost: 8080 / ansatte /", nye medarbejdere, ResponseEntity.class);

4.1. Brug af en indpakningsklasse

Hvis vi har brug for en indpakningsklasse for at være i overensstemmelse med GET-scenariet ovenfor, er det også simpelt. Vi kan sende en ny liste ved hjælp af RestTemplate:

Liste over nye medarbejdere = ny ArrayList (); newEmployees.add (ny medarbejder (3, "praktikant")); newEmployees.add (ny medarbejder (4, "CEO")); restTemplate.postForObject ("// localhost: 8080 / ansatte", ny medarbejderliste (ny medarbejder), ResponseEntity.class);

5. Konklusion

Brug af RestTemplate er en enkel måde at opbygge HTTP-klienter til at kommunikere med dine tjenester.

Det giver en række metoder til at arbejde med hver HTTP-metode og enkle objekter. Med lidt ekstra kode kan vi nemt bruge den til at arbejde med lister over objekter.

Som sædvanlig er den komplette kode tilgængelig i Github-projektet.


$config[zx-auto] not found$config[zx-overlay] not found