RestTemplate Innleggsforespørsel med JSON

REST Topp

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

1. Introduksjon

I denne raske opplæringen illustrerer vi hvordan du bruker Spring's RestTemplate for å komme med POST-forespørsler som sender JSON-innhold.

2. Sette opp eksemplet

La oss starte med å legge til en enkel Person modellklasse for å representere dataene som skal legges ut:

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

Å jobbe med Person objekter, legger vi til en PersonService grensesnitt og implementering med to metoder:

offentlig grensesnitt PersonService {public Person saveUpdatePerson (Person person); offentlig person findPersonById (heltall); }

Implementeringen av disse metodene vil ganske enkelt returnere et objekt. Vi bruker en dummy-implementering av dette laget her, slik at vi kan fokusere på web-laget.

3. REST API-oppsett

La oss definere en enkel REST API for vår Person klasse:

@PostMapping (value = "/ createPerson", forbruker = "application / json", produserer = "application / json") offentlig Person createPerson (@RequestBody Person person) {return personService.saveUpdatePerson (person); } @PostMapping (value = "/ updatePerson", forbruker = "application / json", produserer = "application / json") offentlig person updatePerson (@RequestBody Person person, HttpServletResponse respons) {respons.setHeader ("Location", ServletUriComponentsBuilder. fromCurrentContextPath () .path ("/ findPerson /" + person.getId ()). toUriString ()); returner personService.saveUpdatePerson (person); }

Husk at vi ønsker å legge ut dataene i JSON-format. For å vi la til forbruker attributt i @PostMapping kommentar med verdien av “application / json” for begge metodene.

På samme måte setter vi produserer attributt til "application / json" for å fortelle Spring at vi vil ha responsorganet i JSON-format.

Vi kommenterte person parameter med @Fotball kommentar for begge metodene. Dette vil fortelle våren at person gjenstand vil være bundet til kroppen av HTTP be om.

Til slutt returnerer begge metodene a Person objekt som vil være bundet til responsorganet. La oss merke at vi vil kommentere API-klassen vår med @RestController å kommentere alle API-metoder med en skjult @ResponseBody kommentar.

4. Bruke RestTemplate

Nå kan vi skrive noen få enhetstester for å teste våre Person REST API. Her, Vi prøver å sende POST-forespørsler til Person API ved å bruke POST-metodene som tilbys av RestTemplate: postForObject, postForEntity, og postForLocation.

Før vi begynner å implementere enhetstestene våre, la oss definere en oppsettmetode for å initialisere objektene vi skal bruke i alle enhetstestmetodene våre:

@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 = nye JSONObject (); personJsonObject.put ("id", 1); personJsonObject.put ("navn", "John"); }

Foruten denne installasjonsmetoden, vær oppmerksom på at vi refererer til følgende kartlegger for å konvertere JSON-strengen til en JSONNode objekt i enhetstestene våre:

private final ObjectMapper objectMapper = new ObjectMapper ();

Som tidligere nevnt, vi vil legge ut dataene i JSON-format. For å oppnå dette legger vi til en Innholdstype topptekst til vår forespørsel med APPLICATION_JSON Media type.

Vårens HttpHeaders klasse gir forskjellige metoder for å få tilgang til topptekstene. Her setter vi Innholdstype topptekst til søknad / json ved å ringe setContentType metode. Vi fester topptekster motsette oss våre forespørsler.

4.1. Legger ut JSON med postForObject

RestTemplate‘S postForObject metoden oppretter en ny ressurs ved å legge ut et objekt til den gitte URI-malen. Det returnerer resultatet som automatisk konverteres til typen spesifisert i responsType parameter.

La oss si at vi ønsker å sende en POST-forespørsel til vår Person API for å lage en ny Person objekt og returner dette nyopprettede objektet i svaret.

Først skal vi bygge be om objekt av typen HttpEntity basert på personJsonObject og topptekstene som inneholder Innholdstype. Dette gjør at postForObject metode for å sende et JSON-forespørselsorgan:

@Test offentlig ugyldig givenDataIsJson_whenDataIsPostedByPostForObject_thenResponseBodyIsNotNull () kaster IOException {HttpEntity forespørsel = ny HttpEntity (personJsonObject.toString (), overskrifter); Streng personResultAsJsonStr = restTemplate.postForObject (createPersonUrl, forespørsel, String.class); JsonNode root = objectMapper.readTree (personResultAsJsonStr); assertNotNull (personResultAsJsonStr); assertNotNull (root); assertNotNull (root.path ("navn"). som tekst ()); }

De postForObject () metoden returnerer responsorganet som en String type.

Vi kan også returnere svaret som en Person objektet ved å stille inn responsType parameter:

Personperson = restTemplate.postForObject (createPersonUrl, forespørsel, Person.class); assertNotNull (person); assertNotNull (person.getName ());

Egentlig samsvarer vår metode for forespørselhåndtering med createPersonUrl URI produserer responsorganet i JSON-format.

Men dette er ikke en begrensning for oss - postForObject er i stand til automatisk å konvertere responsorganet til ønsket Java-type (f.eks. String, Person) spesifisert i responsType parameter.

4.2. Legger ut JSON med postForEntity

Sammenlignet med postForObject (), postForEntity () returnerer svaret som en ResponseEntity gjenstand. Bortsett fra det, gjør begge metodene den samme jobben.

La oss si at vi ønsker å sende en POST-forespørsel til vår Person API for å lage en ny Person innvende og returner svaret som en ResponseEntity.

Vi kan benytte oss av postForEntity metode for å implementere dette:

@Test offentlig ugyldig givenDataIsJson_whenDataIsPostedByPostForEntity_thenResponseBodyIsNotNull () kaster IOException {HttpEntity request = new HttpEntity (personJsonObject.toString (), headers); ResponseEntity responseEntityStr = restTemplate. postForEntity (createPersonUrl, forespørsel, String.class); JsonNode root = objectMapper.readTree (responseEntityStr.getBody ()); assertNotNull (responseEntityStr.getBody ()); assertNotNull (root.path ("navn"). som tekst ()); }

I likhet med postForObject, postForEntity har responsType parameter for å konvertere svarteksten til ønsket Java-type.

Her klarte vi å returnere responsorganet som en ResponseEntity.

Vi kan også returnere svaret som en ResponseEntity objektet ved å stille inn responsType parameter til Person.klasse:

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

4.3. Legger ut JSON med postForLocation

I likhet med postForObject og postForEntity metoder, postForLocation oppretter også en ny ressurs ved å legge ut det gitte objektet til den gitte URI. Den eneste forskjellen er at den returnerer verdien av plassering Overskrift.

Husk at vi allerede har sett hvordan du stiller inn plassering overskrift på et svar i vår updatePerson REST API-metoden ovenfor:

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

La oss nå forestille oss det vi ønsker å returnere plassering overskrift på svaret etter oppdatering av person objekt vi la ut.

Vi kan implementere dette ved å bruke postForLocation metode:

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

5. Konklusjon

I denne artikkelen undersøkte vi hvordan du bruker RestTemplate å sende en POST-forespørsel med JSON.

Som alltid kan alle eksemplene og kodebiter finnes på GitHub.

HVILLE bunnen

Jeg kunngjorde nettopp det nye Lær våren kurs, med fokus på det grunnleggende i vår 5 og vårstøvel 2:

>> KONTROLLER KURSET

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