RestTemplate Post Request with JSON

ODPOČINOK Najlepšie

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

1. Úvod

V tomto rýchlom výučbe ilustrujeme, ako používať Spring RestTemplate urobiť POST požiadavky na odoslanie obsahu JSON.

2. Príprava príkladu

Začnime pridaním jednoduchého Osoba modelová trieda, ktorá predstavuje údaje, ktoré sa majú zverejniť:

public class Osoba {private Integer id; súkromné ​​meno reťazca; // štandardný konštruktor, getre, setre}

Pracovať Osoba objekty, pridáme a Personálna služba rozhranie a implementácia dvoma spôsobmi:

verejné rozhranie PersonService {public Person saveUpdatePerson (Osoba osoba); public Person findPersonById (celé číslo); }

Implementácia týchto metód jednoducho vráti objekt. Tu používame fiktívnu implementáciu tejto vrstvy, aby sme sa mohli sústrediť na webovú vrstvu.

3. Nastavenie rozhrania REST API

Poďme definovať jednoduché REST API pre naše Osoba trieda:

@PostMapping (value = "/ createPerson", consumes = "application / json", produce = "application / json") public Person createPerson (@RequestBody Person person) {return personService.saveUpdatePerson (person); } @PostMapping (value = "/ updatePerson", consumes = "application / json", produce = "application / json") verejná osoba updatePerson (@RequestBody Osoba osoba, odpoveď HttpServletResponse) {response.setHeader ("Location", ServletUriComponentsBuilder. fromCurrentContextPath () .path ("/ findPerson /" + person.getId ()). toUriString ()); návrat personService.saveUpdatePerson (osoba); }

Pamätajte, že chceme zverejniť údaje vo formáte JSON. Za týmto účelom pridali sme spotrebúva atribút v @PostMapping anotácia s hodnotou „application / json“ pre obidve metódy.

Podobne sme nastavili vyrába atribút „application / json“, aby sme Springovi povedali, že chceme telo odpovede vo formáte JSON.

Anotovali sme osoba parameter s parametrom @RequestBody anotácia pre obe metódy. To Jarovi povie, že osoba objekt bude viazaný na telo HTTP žiadosť.

Nakoniec obe metódy vrátia a Osoba objekt, ktorý bude naviazaný na telo odpovede. Upozorňujeme, že našu triedu API budeme anotovať @RestController anotovať všetky metódy API skrytým @ResponseBody anotácia.

4. Používanie RestTemplate

Teraz môžeme napísať niekoľko testov jednotiek, aby sme otestovali naše Osoba REST API. Tu, skúsime poslať POST požiadavky do Osoba API pomocou metód POST poskytovaných RestTemplate: postForObject, postForEntitya postForLocation.

Predtým, ako začneme implementovať naše testovanie jednotiek, definujme si metódu nastavenia na inicializáciu objektov, ktoré použijeme vo všetkých našich testovacích metódach jednotiek:

@BeforeClass public static void runBeforeAllTestMethods () {createPersonUrl = "// localhost: 8082 / spring-rest / createPerson"; updatePersonUrl = "// localhost: 8082 / spring-rest / updatePerson"; restTemplate = nový RestTemplate (); hlavičky = nové HttpHeaders (); headers.setContentType (MediaType.APPLICATION_JSON); personJsonObject = nový JSONObject (); personJsonObject.put ("id", 1); personJsonObject.put ("meno", "John"); }

Okrem tejto metódy nastavenia nezabudnite, že na prevedenie reťazca JSON na a budeme odkazovať na nasledujúceho mapovača JSONNode objekt v našich jednotkových testoch:

private final ObjectMapper objectMapper = new ObjectMapper ();

Ako už bolo spomenuté, chceme zverejniť údaje vo formáte JSON. Aby sme to dosiahli, pridáme a Druh obsahu hlavičku našej žiadosti s APPLICATION_JSON Typ média.

Jarné HttpHeaders trieda poskytuje rôzne metódy prístupu k hlavičkám. Tu sme nastavili Druh obsahu hlavička do aplikácia / json zavolaním na setContentType metóda. Pripojíme hlavičky namietajte proti našim požiadavkám.

4.1. Uverejňuje sa JSON s postForObject

RestTemplate‘S postForObject metóda vytvorí nový zdroj zverejnením objektu na danej šablóne URI. Vráti výsledok ako automaticky prevedený na typ uvedený v responseType parameter.

Povedzme, že chceme podať POST požiadavku na našu Osoba API na vytvorenie nového Osoba objekt a v odpovedi vráti tento novovytvorený objekt.

Najskôr postavíme žiadosť objekt typu HttpEntity založený na osobaJsonObject a hlavičky obsahujúce Druh obsahu. To umožňuje postForObject spôsob odoslania tela žiadosti JSON:

@Test public void givenDataIsJson_whenDataIsPostedByPostForObject_thenResponseBodyIsNotNull () hodí IOException {HttpEntity request = new HttpEntity (personJsonObject.toString (), hlavičky); String personResultAsJsonStr = restTemplate.postForObject (createPersonUrl, request, String.class); Root JsonNode = objectMapper.readTree (personResultAsJsonStr); assertNotNull (personResultAsJsonStr); assertNotNull (root); assertNotNull (root.path ("name"). asText ()); }

The postForObject () metóda vráti telo odpovede ako a String typu.

Odpoveď môžeme tiež vrátiť ako Osoba objekt nastavením responseType parameter:

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

Vlastne sa naša metóda vybavovania požiadaviek zhoduje s createPersonUrl URI vytvára telo odpovede vo formáte JSON.

To však pre nás nie je obmedzenie - postForObject je schopný automaticky konvertovať telo odpovede na požadovaný typ Java (napr. String, Osoba) uvedené v responseType parameter.

4.2. Uverejňuje sa JSON s postForEntity

V porovnaní s postForObject (), postForEntity () vráti odpoveď ako a ResponseEntity objekt. Okrem toho obe metódy vykonávajú rovnakú prácu.

Povedzme, že chceme podať POST požiadavku na našu Osoba API na vytvorenie nového Osoba objekt a vrátiť odpoveď ako a ResponseEntity.

Môžeme využiť postForEntity spôsob implementácie tohto:

@Test public void givenDataIsJson_whenDataIsPostedByPostForEntity_thenResponseBodyIsNotNull () hodí IOException {HttpEntity request = new HttpEntity (personJsonObject.toString (), hlavičky); ResponseEntity responseEntityStr = restTemplate. postForEntity (createPersonUrl, požiadavka, String.class); Root JsonNode = objectMapper.readTree (responseEntityStr.getBody ()); assertNotNull (responseEntityStr.getBody ()); assertNotNull (root.path ("name"). asText ()); }

Podobne ako v postForObject, postForEntityresponseType parameter na prevod tela odpovede na požadovaný typ Java.

Tu sme boli schopní vrátiť orgán odpovede ako a ResponseEntity.

Odpoveď môžeme tiež vrátiť ako ResponseEntity objekt nastavením responseType parameter do Osoba.trieda:

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

4.3. Uverejňuje sa JSON s postForLocation

Podobne ako v postForObject a postForEntity metódy, postForLocation tiež vytvorí nový zdroj odoslaním daného objektu na daný URI. Rozdiel je iba v tom, že vráti hodnotu súboru Poloha hlavička.

Pamätajte, že sme už videli, ako nastaviť Poloha hlavička odpovede v našom updatePerson Vyššie uvedená metóda REST API:

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

Teraz si to predstavme chceme vrátiť Poloha hlavička odpovede po aktualizácii osoba objekt, ktorý sme zverejnili.

Môžeme to implementovať pomocou postForLocation metóda:

@Test public void givenDataIsJson_whenDataIsPostedByPostForLocation_thenResponseBodyIsTheLocationHeader () hodí JsonProcessingException {HttpEntity request = new HttpEntity (personJsonObject.toString (), hlavičky); URI locationHeader = restTemplate.postForLocation (updatePersonUrl, požiadavka); assertNotNull (locationHeader); }

5. Záver

V tomto článku sme skúmali, ako sa používa RestTemplate urobiť požiadavku POST pomocou JSON.

Všetky príklady a útržky kódu nájdete ako vždy na GitHub.

REST spodok

Práve som oznámil nové Naučte sa jar kurz zameraný na základy jari 5 a Spring Boot 2:

>> SKONTROLUJTE KURZ

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