RestTemplate Post Request met JSON

REST Top

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS

1. Inleiding

In deze korte tutorial laten we zien hoe je Spring kunt gebruiken RestTemplate om POST-verzoeken te doen voor het verzenden van JSON-inhoud.

2. Het voorbeeld opstellen

Laten we beginnen met het toevoegen van een simple Persoon modelklasse om de te posten gegevens weer te geven:

openbare klasse Persoon {privé Geheel getal-id; private String naam; // standard constructor, getters, setters}

Werken met Persoon objecten, we voegen een PersonService interface en implementatie met twee methoden:

openbare interface PersonService {openbare persoon saveUpdatePerson (Persoon persoon); openbare persoon findPersonById (geheel getal id); }

De implementatie van deze methoden levert eenvoudig een object op. We gebruiken hier een dummy-implementatie van deze laag, zodat we ons kunnen concentreren op de weblaag.

3. REST API-instellingen

Laten we een eenvoudige REST API definiëren voor onze Persoon klasse:

@PostMapping (value = "/ createPerson", consumes = "application / json", produceert = "application / json") public Person createPerson (@RequestBody Person person) {return personService.saveUpdatePerson (persoon); } @PostMapping (value = "/ updatePerson", consumes = "application / json", produceert = "application / json") public Person updatePerson (@RequestBody Person person, HttpServletResponse response) {response.setHeader ("Location", ServletUriComponentsBuilder. fromCurrentContextPath () .path ("/ findPerson /" + person.getId ()). toUriString ()); terugkeer personService.saveUpdatePerson (persoon); }

Onthoud dat we de gegevens in JSON-indeling willen posten. Om dat te bereiken, we hebben de verbruikt attribuut in het @PostMapping annotatie met de waarde "application / json" voor beide methoden.

Evenzo stellen we de produceert attribuut toe aan “application / json” om Spring te vertellen dat we de responsbody in JSON-formaat willen.

We hebben de persoon parameter met de @RequestBody annotatie voor beide methoden. Dit zal Spring vertellen dat de persoon object zal worden gebonden aan de body van het HTTP verzoek.

Ten slotte retourneren beide methoden een Persoon object dat zal worden gebonden aan de responsbody. Laten we opmerken dat we onze API-klasse annoteren met @RestController om alle API-methoden te annoteren met een verborgen @ResponseBody annotatie.

4. Met behulp van RestTemplate

Nu kunnen we een paar unit-tests schrijven om onze Persoon REST API. Hier, we zullen proberen POST-verzoeken naar het Persoon API met behulp van de POST-methoden die worden geleverd door de RestTemplate: postForObject, postForEntity, en postForLocation.

Voordat we beginnen met het implementeren van onze unit-tests, laten we een setup-methode definiëren om de objecten te initialiseren die we zullen gebruiken in al onze unit-testmethoden:

@BeforeClass openbare statische leegte runBeforeAllTestMethods () {createPersonUrl = "// localhost: 8082 / spring-rest / createPerson"; updatePersonUrl = "// localhost: 8082 / spring-rest / updatePerson"; restTemplate = nieuwe RestTemplate (); headers = nieuwe HttpHeaders (); headers.setContentType (MediaType.APPLICATION_JSON); personJsonObject = nieuw JSONObject (); personJsonObject.put ("id", 1); personJsonObject.put ("naam", "John"); }

Houd er naast deze installatiemethode rekening mee dat we naar de volgende mapper verwijzen om de JSON-string naar een JSONNode object in onze unit tests:

private laatste ObjectMapper objectMapper = nieuwe ObjectMapper ();

Zoals eerder vermeld, we willen de gegevens posten in JSON-formaat. Om dit te bereiken, voegen we een Inhoudstype header naar ons verzoek met de APPLICATION_JSON mediatype.

Lente HttpHeaders class biedt verschillende methoden om toegang te krijgen tot de headers. Hier stellen we de Inhoudstype koptekst naar applicatie / json door het setContentType methode. We zullen het headers bezwaar maken tegen onze verzoeken.

4.1. JSON posten met postForObject

RestTemplate‘S postForObject method maakt een nieuwe bron aan door een object naar de opgegeven URI-sjabloon te posten. Het retourneert het resultaat als automatisch geconverteerd naar het type dat is opgegeven in de responseType parameter.

Laten we zeggen dat we een POST-verzoek willen doen aan ons Persoon API om een ​​nieuw Persoon object en retourneer dit nieuw gemaakte object in het antwoord.

Eerst bouwen we het verzoek object van het type HttpEntity gebaseerd op de personJsonObject en de kopteksten met de Inhoudstype. Hierdoor kan de postForObject methode om de body van een JSON-verzoek te verzenden:

@Test openbare leegte gegevenDataIsJson_whenDataIsPostedByPostForObject_thenResponseBodyIsNotNull () gooit IOException {HttpEntity-verzoek = nieuwe HttpEntity (personJsonObject.toString (), headers); String personResultAsJsonStr = restTemplate.postForObject (createPersonUrl, request, String.class); JsonNode root = objectMapper.readTree (personResultAsJsonStr); assertNotNull (personResultAsJsonStr); assertNotNull (root); assertNotNull (root.path ("naam"). asText ()); }

De postForObject () methode retourneert de antwoordtekst als een Draad type.

We kunnen het antwoord ook retourneren als een Persoon object door de responseType parameter:

Persoon person = restTemplate.postForObject (createPersonUrl, verzoek, Person.class); assertNotNull (persoon); assertNotNull (person.getName ());

Eigenlijk komt onze verzoekbehandelingsmethode overeen met de createPersonUrl URI produceert de antwoordtekst in JSON-indeling.

Maar dit is geen beperking voor ons - postForObject kan de antwoordtekst automatisch converteren naar het gevraagde Java-type (bijv. Draad, Persoon) gespecificeerd in de responseType parameter.

4.2. JSON posten met postForEntity

In vergelijking tot postForObject (), postForEntity () geeft het antwoord terug als een ResponseEntity voorwerp. Behalve dat, doen beide methoden hetzelfde werk.

Laten we zeggen dat we een POST-verzoek willen doen aan ons Persoon API om een ​​nieuw Persoon object en retourneer het antwoord als een ResponseEntity.

We kunnen gebruik maken van de postForEntity methode om dit te implementeren:

@Test openbare leegte gegevenDataIsJson_whenDataIsPostedByPostForEntity_thenResponseBodyIsNotNull () gooit IOException {HttpEntity-verzoek = nieuwe HttpEntity (personJsonObject.toString (), headers); ResponseEntity responseEntityStr = restTemplate. postForEntity (createPersonUrl, request, String.class); JsonNode root = objectMapper.readTree (responseEntityStr.getBody ()); assertNotNull (responseEntityStr.getBody ()); assertNotNull (root.path ("naam"). asText ()); }

Net als bij de postForObject, postForEntity heeft de responseType parameter om de antwoordtekst naar het gevraagde Java-type te converteren.

Hier konden we de antwoordtekst retourneren als een ResponseEntity.

We kunnen het antwoord ook retourneren als een ResponseEntity object door de responseType parameter naar Persoon. Klasse:

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

4.3. JSON posten met postForLocation

Net als bij de postForObject en postForEntity methoden, postForLocation maakt ook een nieuwe bron aan door het opgegeven object naar de opgegeven URI te posten. Het enige verschil is dat het de waarde van de retourneert Plaats koptekst.

Onthoud dat we al hebben gezien hoe we de Plaats koptekst van een reactie in ons updatePerson REST API-methode hierboven:

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

Laten we ons dat nu eens voorstellen we willen de Plaats header van het antwoord na het bijwerken van de persoon object dat we hebben gepost.

We kunnen dit implementeren door de postForLocation methode:

@Test openbare leegte gegevenDataIsJson_whenDataIsPostedByPostForLocation_thenResponseBodyIsTheLocationHeader () gooit JsonProcessingException {HttpEntity-verzoek = nieuwe HttpEntity (personJsonObject.toString (), headers); URI locationHeader = restTemplate.postForLocation (updatePersonUrl, verzoek); assertNotNull (locationHeader); }

5. Conclusie

In dit artikel hebben we onderzocht hoe u RestTemplate om een ​​POST-verzoek te doen met JSON.

Zoals altijd zijn alle voorbeelden en codefragmenten te vinden op GitHub.

REST onder

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS