Vodič za RestTemplate

1. Pregled

U ovom uputstvu ilustrirat ćemo širok spektar operacija gdje Spring REST klijent - RestTemplate - može se koristiti i dobro koristiti.

Za API stranu svih primjera, odavde ćemo pokretati uslugu RESTful.

2. Obavijest o ukidanju

Od Spring Framework 5, uz stog WebFlux, Spring je predstavio i novi HTTP klijent pod nazivom WebClient.

WebClient je moderni, alternativni HTTP klijent RestTemplate. Ne samo da pruža tradicionalni sinkroni API, već također podržava učinkovit neblokirajući i asinkroni pristup.

To je reklo, ako razvijamo nove programe ili migriramo staru, dobra je ideja za upotrebu WebClient. Ići naprijed, RestTemplate bit će zastarjelo u budućim verzijama.

3. Koristite GET za dohvaćanje resursa

3.1. Nabavite obični JSON

Krenimo jednostavno i razgovarajmo o GET zahtjevima sa brzi primjer korištenja getForEntity () API:

RestTemplate restTemplate = novi RestTemplate (); String fooResourceUrl = "// localhost: 8080 / spring-rest / foos"; ResponseEntity odgovor = restTemplate.getForEntity (fooResourceUrl + "/ 1", String.class); assertThat (response.getStatusCode (), jednakTo (HttpStatus.OK));

Primijetite da imamo puni pristup HTTP odgovoru, tako da možemo raditi stvari poput provjere statusnog koda kako bismo bili sigurni da je operacija bila uspješna ili raditi sa stvarnim tijelom odgovora:

Mapa ObjectMapper = novi ObjectMapper (); JsonNode root = mapper.readTree (response.getBody ()); JsonNode name = root.path ("name"); assertThat (name.asText (), notNullValue ());

Ovdje radimo s tijelom odgovora kao standardnim nizom i koristimo Jackson (i strukturu čvora JSON koju Jackson pruža) za provjeru nekih detalja.

3.2. Dohvaćanje POJO-a Umjesto JSON-a

Odgovor također možemo mapirati izravno u DTO resursa:

javna klasa Foo implementira Serializable {private long id; privatni naziv niza; // standardni geteri i postavljači}

Sada možemo jednostavno koristiti getForObject API u predlošku:

Foo foo = restTemplate .getForObject (fooResourceUrl + "/ 1", Foo.class); assertThat (foo.getName (), notNullValue ()); assertThat (foo.getId (), je (1L));

4. Upotrijebite HEAD za dohvaćanje zaglavlja

Kratko ćemo pogledati upotrebu HEAD-a prije nego što prijeđemo na uobičajenije metode.

Koristit ćemo headForHeaders () API ovdje:

HttpHeaders httpHeaders = restTemplate.headForHeaders (fooResourceUrl); assertTrue (httpHeaders.getContentType (). uključuje (MediaType.APPLICATION_JSON));

5. Koristite POST za stvaranje resursa

Da bismo stvorili novi resurs u API-ju, možemo dobro iskoristiti postForLocation (), postForObject () ili postForEntity () Apis.

Prvi vraća URI novostvorenog resursa, dok drugi vraća sam resurs.

5.1. The postForObject () API

RestTemplate restTemplate = novi RestTemplate (); Zahtjev za HttpEntity = novi HttpEntity (novi Foo ("traka")); Foo foo = restTemplate.postForObject (fooResourceUrl, zahtjev, Foo.class); assertThat (foo, notNullValue ()); assertThat (foo.getName (), je ("bar"));

5.2. The postForLocation () API

Slično tome, pogledajmo operaciju koja umjesto vraćanja punog resursa, samo vraća Mjesto tog novostvorenog resursa:

Zahtjev za HttpEntity = novi HttpEntity (novi Foo ("traka")); URI lokacija = restTemplate .postForLocation (fooResourceUrl, zahtjev); assertThat (location, notNullValue ());

5.3. The razmjena () API

Pogledajmo kako napraviti POST s više generičkih razmjena API:

RestTemplate restTemplate = novi RestTemplate (); Zahtjev za HttpEntity = novi HttpEntity (novi Foo ("traka")); ResponseEntity odgovor = restTemplate .exchange (fooResourceUrl, HttpMethod.POST, zahtjev, Foo.class); assertThat (response.getStatusCode (), je (HttpStatus.CREATED)); Foo foo = response.getBody (); assertThat (foo, notNullValue ()); assertThat (foo.getName (), je ("bar")); 

5.4. Pošaljite podatke obrasca

Dalje, pogledajmo kako poslati obrazac pomoću metode POST.

Prvo, moramo postaviti Vrsta sadržaja zaglavlje do application / x-www-form-urlencoded.

To osigurava da se velik upit upita može poslati poslužitelju, koji sadrži parove imena / vrijednosti odvojene znakom &:

HttpHeaders zaglavlja = novi HttpHeaders (); headers.setContentType (MediaType.APPLICATION_FORM_URLENCODED);

Varijable oblika možemo umotati u LinkedMultiValueMap:

Karta MultiValueMap = nova LinkedMultiValueMap (); map.add ("id", "1");

Sljedeći, Zahtjev gradimo pomoću HttpEntity primjer:

HttpEntity zahtjev = novi HttpEntity (karta, zaglavlja);

Napokon, putem REST usluge možemo se povezati pozivom restTemplate.postForEntity () na Krajnjoj točki: /foos/oblik

ResponseEntity odgovor = restTemplate.postForEntity (fooResourceUrl + "/ form", zahtjev, String.class); assertThat (response.getStatusCode (), je (HttpStatus.CREATED));

6. Koristite OPCIJE za dobivanje dopuštenih operacija

Dalje, imat ćemo kratki uvid u korištenje OPTIONS zahtjeva i istraživanje dopuštenih operacija na određenom URI-ju pomoću ove vrste zahtjeva; API je optionsForAllow:

Postavite optionsForAllow = restTemplate.optionsForAllow (fooResourceUrl); HttpMethod [] supportedMethods = {HttpMethod.GET, HttpMethod.POST, HttpMethod.PUT, HttpMethod.DELETE}; assertTrue (optionsForAllow.containsAll (Arrays.asList (supportedMethods))));

7. Upotrijebite PUT za ažuriranje resursa

Dalje ćemo početi gledati PUT i preciznije razmjena () API za ovu operaciju od predložak.put API je prilično jednostavan.

7.1. Jednostavan STAVITI S razmjena ()

Počet ćemo s jednostavnom operacijom PUT protiv API-ja - i imajte na umu da operacija ne vraća tijelo natrag klijentu:

Foo updatedInstance = novi Foo ("novoIme"); updatedInstance.setId (createResponse.getBody (). getId ()); String resourceUrl = fooResourceUrl + '/' + createResponse.getBody (). GetId (); HttpEntity requestUpdate = novi HttpEntity (updatedInstance, zaglavlja); template.exchange (resourceUrl, HttpMethod.PUT, requestUpdate, Void.class);

7.2. STAVITI S razmjena () i zahtjev za povratni poziv

Dalje, koristit ćemo povratni poziv zahtjeva za izdavanje PUT-a.

Obavezno pripremimo povratni poziv, gdje možemo postaviti sva zaglavlja koja su nam potrebna, kao i tijelo zahtjeva:

RequestCallback requestCallback (konačni Foo updatedInstance) {return clientHttpRequest -> {ObjectMapper mapper = novi ObjectMapper (); mapper.writeValue (clientHttpRequest.getBody (), updatedInstance); clientHttpRequest.getHeaders (). add (HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); clientHttpRequest.getHeaders (). add (HttpHeaders.AUTHORIZATION, "Basic" + getBase64EncodedLogPass ()); }; }

Dalje kreiramo Resurs s POST zahtjevom:

ResponseEntity odgovor = restTemplate .exchange (fooResourceUrl, HttpMethod.POST, zahtjev, Foo.class); assertThat (response.getStatusCode (), je (HttpStatus.CREATED));

A zatim ažuriramo resurs:

Foo updatedInstance = novi Foo ("novoIme"); updatedInstance.setId (response.getBody (). getId ()); String resourceUrl = fooResourceUrl + '/' + response.getBody (). GetId (); restTemplate.execute (resourceUrl, HttpMethod.PUT, requestCallback (updatedInstance), clientHttpResponse -> null);

8. Koristite DELETE za uklanjanje resursa

Da bismo uklonili postojeći resurs, brzo ćemo upotrijebiti izbrisati() API:

Niz entityUrl = fooResourceUrl + "/" + postojećiResource.getId (); restTemplate.delete (entityUrl); 

9. Konfigurirajte vremensko ograničenje

Možemo konfigurirati RestTemplate da istekne vrijeme jednostavnim korištenjem ClientHttpRequestFactory:

RestTemplate restTemplate = novi RestTemplate (getClientHttpRequestFactory ()); privatni ClientHttpRequestFactory getClientHttpRequestFactory () {int timeout = 5000; HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = novo HttpComponentsClientHttpRequestFactory (); clientHttpRequestFactory.setConnectTimeout (timeout); vratiti clientHttpRequestFactory; }

I možemo koristiti HttpClient za daljnje mogućnosti konfiguracije:

privatni ClientHttpRequestFactory getClientHttpRequestFactory () {int timeout = 5000; RequestConfig config = RequestConfig.custom () .setConnectTimeout (timeout) .setConnectionRequestTimeout (timeout) .setSocketTimeout (timeout) .build (); CloseableHttpClient client = HttpClientBuilder .create () .setDefaultRequestConfig (config) .build (); vrati novi HttpComponentsClientHttpRequestFactory (klijent); }

10. Zaključak

U ovom smo članku prešli na glavne HTTP glagole koristeći RestTemplate za orkestriranje zahtjeva koristeći sve ove.

Ako želite istražiti kako provjeriti autentičnost pomoću predloška, ​​pogledajte naš članak o Osnovnoj autorizaciji s RestTemplate.

Provedbu svih ovih primjera i isječaka koda možete pronaći na GitHubu.


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