RestTemplate Post Zahtjev s JSON-om

OSTALO Vrh

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ

1. Uvod

U ovom brzom uputstvu ilustriramo kako se koristiti Spring's RestTemplate za izradu POST zahtjeva koji šalju JSON sadržaj.

2. Postavljanje primjera

Počnimo s dodavanjem jednostavnog Osoba klasa modela koja predstavlja podatke koji se objavljuju:

javna klasa Osoba {private Integer id; privatni naziv niza; // standardni konstruktor, getteri, postavljači}

Za rad Osoba objekte, dodati ćemo a PersonService sučelje i implementacija s dvije metode:

javno sučelje PersonService {javno Person saveUpdatePerson (Osoba osoba); javni Person findPersonById (Integer id); }

Provedba ovih metoda jednostavno će vratiti objekt. Ovdje koristimo lažnu implementaciju ovog sloja kako bismo se mogli usredotočiti na web sloj.

3. REST API postavljanje

Definirajmo jednostavni REST API za naš Osoba razred:

@PostMapping (value = "/ createPerson", konzumira = "application / json", produce = "application / json") javna osoba createPerson (@RequestBody Person person) {return personService.saveUpdatePerson (person); } @PostMapping (value = "/ updatePerson", konzumira = "application / json", produce = "application / json") javna osoba updatePerson (@RequestBody Person person, HttpServletResponse response) {response.setHeader ("Location", ServletUriComponentsBuilder. fromCurrentContextPath () .path ("/ findPerson /" + person.getId ()). toUriString ()); vratiti personService.saveUpdatePerson (osoba); }

Zapamtite, podatke želimo objaviti u JSON formatu. Da bi to, dodali smo troši atribut u @PostMapping napomena s vrijednošću "application / json" za obje metode.

Slično tome, postavili smo proizvodi atribut “application / json” kako bi Springu rekao da želimo tijelo odgovora u JSON formatu.

Zabilježili smo osoba parametar s @RequestBody napomena za obje metode. To će proljeću reći da osoba objekt će biti vezan za tijelo HTTP zahtjev.

Na kraju, obje metode vraćaju a Osoba objekt koji će biti vezan za tijelo odgovora. Napomenimo da ćemo označiti našu klasu API-ja @RestController za označavanje svih API metoda skrivenim @ResponseBody bilješka.

4. Korištenje RestTemplate

Sada možemo napisati nekoliko jediničnih testova za testiranje našeg Osoba REST API. Ovdje, pokušat ćemo poslati POST zahtjeve na Osoba API korištenjem POST metoda koje pruža RestTemplate: postForObject, postForEntity, i postForLocation.

Prije nego što započnemo s implementacijom naših unit testova, definirajmo metodu postavljanja za inicijalizaciju objekata koji ćemo koristiti u svim našim unit test metodama:

@BeforeClass javna statička praznina runBeforeAllTestMethods () {createPersonUrl = "// localhost: 8082 / spring-rest / createPerson"; updatePersonUrl = "// localhost: 8082 / spring-rest / updatePerson"; restTemplate = novi RestTemplate (); zaglavlja = novi HttpHeaders (); headers.setContentType (MediaType.APPLICATION_JSON); personJsonObject = novi JSONObject (); personJsonObject.put ("id", 1); personJsonObject.put ("ime", "Ivan"); }

Osim ove metode postavljanja, imajte na umu da ćemo se za pretvaranje JSON Stringa u a JSONNode objekt u našim jediničnim testovima:

privatni konačni ObjectMapper objectMapper = novi ObjectMapper ();

Kao što je prethodno spomenuto, podatke želimo objaviti u JSON formatu. Da bismo to postigli, dodati ćemo a Vrsta sadržaja zaglavlje na naš zahtjev s APLIKACIJA_JSON vrsta medija.

Proljetni HttpHeaders klasa pruža različite metode za pristup zaglavljima. Ovdje smo postavili Vrsta sadržaja zaglavlje do aplikacija / json pozivom na setContentType metoda. Priložit ćemo zaglavlja usprotivite se našim zahtjevima.

4.1. Objavljivanje JSON-a sa postForObject

RestTemplate‘S postForObject metoda stvara novi resurs objavljivanjem objekta u zadani URI predložak. Vraća rezultat kao automatski pretvoren u vrstu navedenu u responseType parametar.

Recimo da želimo poslati POST zahtjev svom Osoba API za stvaranje novog Osoba objekt i u odgovoru vratite ovaj novostvoreni objekt.

Prvo ćemo izgraditi zahtjev objekt tipa HttpEntity bazirano na personJsonObject i zaglavlja koja sadrže Vrsta sadržaja. To omogućuje postForObject način slanja JSON tijela zahtjeva:

@Test public void givenDataIsJson_whenDataIsPostedByPostForObject_thenResponseBodyIsNotNull () baca IOException {HttpEntity request = new HttpEntity (personJsonObject.toString (), headers); Niz personResultAsJsonStr = restTemplate.postForObject (createPersonUrl, zahtjev, String.class); JsonNode root = objectMapper.readTree (personResultAsJsonStr); assertNotNull (personResultAsJsonStr); assertNotNull (korijen); assertNotNull (root.path ("name"). asText ()); }

The postForObject () metoda vraća tijelo odgovora kao a Niz tip.

Odgovor također možemo vratiti kao a Osoba objekt postavljanjem responseType parametar:

Osoba osoba = restTemplate.postForObject (createPersonUrl, zahtjev, Person.class); assertNotNull (osoba); assertNotNull (person.getName ());

Zapravo, naša metoda obrade zahtjeva podudara se s createPersonUrl URI proizvodi tijelo odgovora u JSON formatu.

Ali ovo nije ograničenje za nas - postForObject je u stanju automatski pretvoriti tijelo odgovora u traženi tip Java (npr. Niz, Osoba) naveden u responseType parametar.

4.2. Objavljivanje JSON-a sa postForEntity

U usporedbi sa postForObject (), postForEntity () vraća odgovor kao a ResponseEntity objekt. Osim toga, obje metode rade isti posao.

Recimo da želimo poslati POST zahtjev svom Osoba API za stvaranje novog Osoba objekt i vratiti odgovor kao a ResponseEntity.

Možemo se poslužiti postForEntity metoda za provedbu ovoga:

@Test public void givenDataIsJson_whenDataIsPostedByPostForEntity_thenResponseBodyIsNotNull () baca IOException {HttpEntity request = new HttpEntity (personJsonObject.toString (), headers); ResponseEntity responseEntityStr = restTemplate. postForEntity (createPersonUrl, zahtjev, String.class); JsonNode root = objectMapper.readTree (responseEntityStr.getBody ()); assertNotNull (responseEntityStr.getBody ()); assertNotNull (root.path ("name"). asText ()); }

Slično kao postForObject, postForEntity ima responseType parametar za pretvorbu tijela odgovora u traženi tip Java.

Ovdje smo uspjeli vratiti tijelo odgovora kao ResponseEntity.

Odgovor također možemo vratiti kao a ResponseEntity objekt postavljanjem responseType parametar do Osoba.razred:

ResponseEntity responseEntityPerson = restTemplate. postForEntity (createPersonUrl, zahtjev, Person.class); assertNotNull (responseEntityPerson.getBody ()); assertNotNull (responseEntityPerson.getBody (). getName ());

4.3. Objavljivanje JSON-a sa postForLocation

Slično kao postForObject i postForEntity metode, postForLocation također stvara novi resurs objavljivanjem datog objekta na zadani URI. Jedina razlika je u tome što vraća vrijednost Mjesto Zaglavlje.

Zapamtite, već smo vidjeli kako postaviti Mjesto zaglavlje odgovora u našem updatePerson REST API metoda iznad:

response.setHeader ("Location", ServletUriComponentsBuilder.fromCurrentContextPath () .path ("/ findPerson /" + person.getId ()). toUriString ());

Sad to zamislimo želimo vratiti Mjesto zaglavlje odgovora nakon ažuriranja osoba objekt koji smo objavili.

To možemo implementirati pomoću postForLocation metoda:

@Test public void givenDataIsJson_whenDataIsPostedByPostForLocation_thenResponseBodyIsTheLocationHeader () baca JsonProcessingException {HttpEntity request = new HttpEntity (personJsonObject.toString (), headers;) URI locationHeader = restTemplate.postForLocation (updatePersonUrl, zahtjev); assertNotNull (locationHeader); }

5. Zaključak

U ovom smo članku istražili kako se koristi RestTemplate za slanje POST zahtjeva s JSON-om.

Kao i uvijek, svi primjeri i isječci koda mogu se naći na GitHubu.

OSTALO dno

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ