Korištenje presretača Spring RestTemplate

1. Pregled

U ovom uputstvu naučit ćemo kako implementirati Spring RestTemplatePresretač.

Proći ćemo kroz primjer u kojem ćemo stvoriti presretač koji dodaje prilagođeno zaglavlje odgovoru.

2. Scenariji upotrebe presretača

Osim izmjene zaglavlja, neki od ostalih slučajeva upotrebe gdje a RestTemplate presretač je koristan su:

  • Zapisivanje zahtjeva i odgovora
  • Ponovni pokušaj zahtjeva s konfigurabilnom strategijom odbijanja
  • Odbijanje zahtjeva na temelju određenih parametara zahtjeva
  • Promjena adrese URL-a zahtjeva

3. Izrada presretača

U većini paradigmi programiranja, presretači su bitan dio koji programerima omogućuje kontrolu izvršavanja presretanjem. Proljetni okvir također podržava razne presretače za različite svrhe.

Proljeće RestTemplate omogućuje nam dodavanje presretača koji implementiraju ClientHttpRequestInterceptor sučelje. The presretanje (HttpRequest, bajt [], ClientHttpRequestExecution) metoda ovog sučelja presretnut će zadani zahtjev i vratiti odgovor dajući nam pristup zahtjev, tijelo i izvršenje predmeta.

Koristit ćemo ClientHttpRequestExecution argument za stvarno izvršavanje i prosljeđivanje zahtjeva na sljedeći procesni lanac.

Kao prvi korak, stvorimo klasu presretača koja implementira ClientHttpRequestInterceptor sučelje:

javna klasa RestTemplateHeaderModifierInterceptor implementira ClientHttpRequestInterceptor {@Override javni ClientHttpResponse presretanje (zahtjev HttpRequest, bajt [], ClientHttpRequestExecution) baca IOException {ClientHttpRespoecute body; response.getHeaders (). add ("Foo", "bar"); odgovor na povratak; }}

Naš presretač bit će pozvan za svaki dolazni zahtjevi dodati će prilagođeno zaglavlje Foo na svaki odgovor, nakon što se izvršenje dovrši i vrati.

Budući da je presresti () metoda uključuje zahtjev i tijelo kao argumente moguće je izvršiti bilo kakvu izmjenu zahtjeva ili čak odbiti izvršenje zahtjeva na temelju određenih uvjeta.

4. Postavljanje RestTemplate

Sad kad smo stvorili presretač, stvorimo RestTemplate grah i dodajte mu naš presretač:

@Configuration javna klasa RestClientConfig {@Bean public RestTemplate restTemplate () {RestTemplate restTemplate = new RestTemplate (); Navesti presretače = restTemplate.getInterceptors (); if (CollectionUtils.isEmpty (presretači)) {presretači = novi ArrayList (); } interceptors.add (novi RestTemplateHeaderModifierInterceptor ()); restTemplate.setInterceptors (presretači); povratak restTemplate; }}

U nekim slučajevima možda postoje presretači koji su već dodani u RestTemplate objekt. Dakle, da bismo osigurali da sve funkcionira prema očekivanjima, naš će kôd pokrenuti popis presretača samo ako je prazan.

Kao što pokazuje naš kod, koristimo zadani konstruktor za stvaranje RestTemplate objekt, ali postoje neki scenariji u kojima moramo dva puta pročitati tok zahtjeva / odgovora.

Na primjer, ako želimo da naš presretač funkcionira kao zapisnik zahtjeva / odgovora, tada ga moramo pročitati dva puta - prvi put presretač, a drugi put klijent.

Zadana implementacija omogućuje nam čitanje toka odgovora samo jednom. Kako bi se opskrbio takvim specifičnim scenarijima, Spring nudi posebnu klasu tzv BufferingClientHttpRequestFactory. Kao što i samo ime govori, ova će klasa spremiti zahtjev / odgovor u JVM memoriju za višestruku upotrebu.

Evo kako RestTemplate objekt se inicijalizira pomoću BufferingClientHttpRequestFactory da biste omogućili predmemoriranje toka zahtjeva / odgovora:

RestTemplate restTemplate = novi RestTemplate (novi BufferingClientHttpRequestFactory (novi SimpleClientHttpRequestFactory ()));

5. Testiranje našeg primjera

Evo JUnit test slučaja za testiranje našeg RestTemplate presretač:

javna klasa RestTemplateItegrationTest {@Autowired RestTemplate restTemplate; @Test javna praznina givenRestTemplate_whenReanted_thenLogAndModifyResponse () {LoginForm loginForm = novi LoginForm ("username", "password"); HttpEntity requestEntity = novi HttpEntity (obrazac za prijavu); HttpHeaders zaglavlja = novi HttpHeaders (); headers.setContentType (MediaType.APPLICATION_JSON); ResponseEntity responseEntity = restTemplate.postForEntity ("//httpbin.org/post", requestEntity, String.class); assertThat (responseEntity.getStatusCode (), je (jednakTo (HttpStatus.OK))); assertThat (responseEntity.getHeaders (). get ("Foo"). get (0), je (jednakTo ("bar"))); }}

Ovdje smo koristili slobodno hostiranu HTTP uslugu zahtjeva i odgovora //httpbin.orgobjaviti naše podatke. Ova usluga testiranja vratit će naše tijelo zahtjeva zajedno s nekim metapodacima.

6. Zaključak

Ovaj je vodič o tome kako postaviti presretač i dodati ga u RestTemplate objekt. Ova vrsta presretača također se može koristiti za filtriranje, nadzor i kontrolu dolaznih zahtjeva.

Uobičajeni slučaj upotrebe a RestTemplate presretač je modifikacija zaglavlja - što smo detaljno ilustrirali u ovom članku.

Kao i uvijek, primjer koda možete pronaći na projektu Github. Ovo je projekt zasnovan na Mavenu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.


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