RestTemplate postanmodning med JSON

REST Top

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

1. Introduktion

I denne hurtige vejledning illustrerer vi, hvordan du bruger Spring's RestTemplate at foretage POST-anmodninger, der sender JSON-indhold.

2. Opsætning af eksemplet

Lad os starte med at tilføje en simpel Person modelklasse til at repræsentere de data, der skal bogføres:

offentlig klasse person {privat heltal id; privat strengnavn; // standard konstruktør, getters, setters}

At arbejde med Person objekter, tilføjer vi en PersonService interface og implementering med to metoder:

offentlig grænseflade PersonService {offentlig person saveUpdatePerson (personperson); offentlig person findPersonById (heltal-id); }

Implementeringen af ​​disse metoder returnerer simpelthen et objekt. Vi bruger en dummy-implementering af dette lag her, så vi kan fokusere på weblaget.

3. Opsætning af REST API

Lad os definere en simpel REST API til vores Person klasse:

@PostMapping (værdi = "/ createPerson", forbruger = "applikation / json", producerer = "applikation / json") offentlig person createPerson (@RequestBody Person person) {return personService.saveUpdatePerson (person); } @PostMapping (værdi = "/ updatePerson", forbruger = "applikation / json", producerer = "applikation / json") offentlig person updatePerson (@RequestBody Person person, HttpServletResponse svar) {respons.setHeader ("Location", ServletUriComponentsBuilder. fromCurrentContextPath () .path ("/ findPerson /" + person.getId ()). toUriString ()); returner personService.saveUpdatePerson (person); }

Husk, vi vil sende dataene i JSON-format. For at vi tilføjede forbruger attribut i @PostMapping anmærkning med værdien af ​​"applikation / json" for begge metoder.

På samme måde indstiller vi producerer attribut til "application / json" for at fortælle Spring, at vi vil have responsorganet i JSON-format.

Vi kommenterede person parameter med @RequestBody kommentar til begge metoder. Dette vil fortælle foråret, at person genstand vil være bundet til kroppen af HTTP anmodning.

Endelig returnerer begge metoder a Person objekt, der vil være bundet til responsorganet. Lad os bemærke, at vi kommenterer vores API-klasse med @RestController at kommentere alle API-metoder med en skjult @ResponseBody kommentar.

4. Brug RestTemplate

Nu kan vi skrive et par enhedstest for at teste vores Person REST API. Her, Vi prøver at sende POST-anmodninger til Person API ved hjælp af POST-metoderne fra RestTemplate: postForObject, postForEntityog postForLocation.

Før vi begynder at implementere vores enhedstest, lad os definere en installationsmetode til at initialisere de objekter, som vi bruger i alle vores enhedstestmetoder:

@BeforeClass offentlig statisk ugyldig runBeforeAllTestMethods () {createPersonUrl = "// localhost: 8082 / spring-rest / createPerson"; updatePersonUrl = "// localhost: 8082 / spring-rest / updatePerson"; restTemplate = ny RestTemplate (); headers = nye HttpHeaders (); headers.setContentType (MediaType.APPLICATION_JSON); personJsonObject = nyt JSONObject (); personJsonObject.put ("id", 1); personJsonObject.put ("navn", "John"); }

Udover denne installationsmetode skal du bemærke, at vi henviser til følgende kortlægger for at konvertere JSON-strengen til en JSONNode objekt i vores enhedstest:

privat endelig ObjectMapper objectMapper = ny ObjectMapper ();

Som tidligere nævnt, vi vil sende dataene i JSON-format. For at opnå dette tilføjer vi en Indholdstype header til vores anmodning med APPLICATION_JSON medietype.

Forårets HttpHeaders klasse giver forskellige metoder til at få adgang til overskrifterne. Her indstiller vi Indholdstype header til ansøgning / json ved at ringe til setContentType metode. Vi vedhæfter overskrifter gøre indsigelse mod vores anmodninger.

4.1. Udstationering af JSON med postForObject

RestTemplate'S postForObject metoden opretter en ny ressource ved at sende et objekt til den givne URI-skabelon. Det returnerer resultatet som automatisk konverteret til den type, der er angivet i responsType parameter.

Lad os sige, at vi ønsker at sende en POST-anmodning til vores Person API til at oprette en ny Person objekt og returner dette nyoprettede objekt i svaret.

Først bygger vi anmodning objekt af typen HttpEntity baseret på personJsonObject og overskrifter indeholdende Indholdstype. Dette gør det muligt for postForObject metode til at sende et JSON-anmodningsorgan:

@Test offentlig ugyldighed givenDataIsJson_whenDataIsPostedByPostForObject_thenResponseBodyIsNotNull () smider IOException {HttpEntity anmodning = ny HttpEntity (personJsonObject.toString (), overskrifter); String personResultAsJsonStr = restTemplate.postForObject (createPersonUrl, anmodning, String.class); JsonNode root = objectMapper.readTree (personResultAsJsonStr); assertNotNull (personResultAsJsonStr); assertNotNull (rod); assertNotNull (root.path ("navn"). som tekst ()); }

Det postForObject () metode returnerer svarlegemet som en Snor type.

Vi kan også returnere svaret som en Person objekt ved at indstille responsType parameter:

Person person = restTemplate.postForObject (createPersonUrl, anmodning, Person.class); assertNotNull (person); assertNotNull (person.getName ());

Faktisk matcher vores anmodningshåndteringsmetode med createPersonUrl URI producerer responsorganet i JSON-format.

Men dette er ikke en begrænsning for os - postForObject er i stand til automatisk at konvertere svarorganet til den ønskede Java-type (f.eks. Snor, Person) specificeret i responsType parameter.

4.2. Udstationering af JSON med postForEntity

Sammenlignet med postForObject (), postForEntity () returnerer svaret som en SvarEnhed objekt. Bortset fra det gør begge metoder det samme job.

Lad os sige, at vi ønsker at sende en POST-anmodning til vores Person API til at oprette en ny Person gøre indsigelse og returnere svaret som en SvarEnhed.

Vi kan gøre brug af postForEntity metode til at implementere dette:

@Test offentlig ugyldighed givenDataIsJson_whenDataIsPostedByPostForEntity_thenResponseBodyIsNotNull () smider IOException {HttpEntity anmodning = ny HttpEntity (personJsonObject.toString (), overskrifter); ResponseEntity responseEntityStr = restTemplate. postForEntity (createPersonUrl, anmodning, String.class); JsonNode rod = objectMapper.readTree (responsEntityStr.getBody ()); assertNotNull (responsEntityStr.getBody ()); assertNotNull (root.path ("navn"). som tekst ()); }

Svarende til postForObject, postForEntity har responsType parameter for at konvertere svarteksten til den ønskede Java-type.

Her var vi i stand til at returnere svarorganet som en SvarEnhed.

Vi kan også returnere svaret som en SvarEnhed objekt ved at indstille responsType parameter til Person.klasse:

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

4.3. Udstationering af JSON med postForLocation

Svarende til postForObject og postForEntity metoder, postForLocation opretter også en ny ressource ved at sende det givne objekt til den givne URI. Den eneste forskel er, at den returnerer værdien af Beliggenhed header.

Husk, vi har allerede set, hvordan man indstiller Beliggenhed overskrift på et svar i vores updatePerson REST API-metoden ovenfor:

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

Lad os forestille os det vi vil returnere Beliggenhed header på svaret efter opdatering af person objekt, vi sendte.

Vi kan implementere dette ved hjælp af postForLocation metode:

@Test offentlig ugyldighed givenDataIsJson_whenDataIsPostedByPostForLocation_thenResponseBodyIsTheLocationHeader () kaster JsonProcessingException {HttpEntity anmodning = ny HttpEntity (personJsonObject.toString (), overskrifter); URI locationHeader = restTemplate.postForLocation (updatePersonUrl, anmodning); assertNotNull (locationHeader); }

5. Konklusion

I denne artikel undersøgte vi, hvordan du bruger RestTemplate at foretage en POST-anmodning med JSON.

Som altid kan alle eksemplerne og kodestykkerne findes på GitHub.

REST bunden

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

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