Bruke Spring RestTemplate Interceptor

1. Oversikt

I denne veiledningen skal vi lære å implementere en vår RestTemplateInterceptor.

Vi går gjennom et eksempel der vi oppretter en avlytter som legger til en tilpasset overskrift i svaret.

2. Scenarier for interceptorbruk

Foruten modifikasjon av topptekst, noen av de andre brukssakene der en RestTemplate interceptor er nyttig er:

  • Forespørsel og svarlogging
  • Forsøker forespørslene på nytt med en konfigurerbar back-off-strategi
  • Be om avslag basert på visse forespørselsparametere
  • Endring av URL-adressen til forespørselen

3. Opprette interceptor

I de fleste programmeringsparadigmer, interceptors er en viktig del som gjør det mulig for programmerere å kontrollere utførelsen ved å fange den. Spring framework støtter også en rekke interceptors for forskjellige formål.

Vår RestTemplate lar oss legge til interceptors som implementeres ClientHttpRequestInterceptor grensesnitt. De avlytte (HttpRequest, byte [], ClientHttpRequestExecution) metoden for dette grensesnittet vil fange opp den forespurte og returnere svaret ved å gi oss tilgang til be om, kropp og henrettelse gjenstander.

Vi bruker ClientHttpRequestExecution argument for å utføre selve kjøringen, og videreføre forespørselen til den påfølgende prosesskjeden.

Som et første trinn, la oss lage en interceptor-klasse som implementerer ClientHttpRequestInterceptor grensesnitt:

offentlig klasse RestTemplateHeaderModifierInterceptor implementerer ClientHttpRequestInterceptor {@Override offentlig ClientHttpResponse-avlyssning (HttpRequest-forespørsel, byte [] body, ClientHttpRequestExecution-utførelse) kaster IOException {ClientHttpResponse respons = executie.execute (forespørsel, kropp); respons.getHeaders (). legg til ("Foo", "bar"); returrespons; }}

Interceptor vår vil bli påkalt for hver innkommende forespørsel, og det vil legge til en tilpasset overskrift Foo til hvert svar, når utførelsen er fullført og tilbake.

Siden avskjære() metoden inkluderte be om og kropp som argumenter er det også mulig å gjøre endringer på forespørselen eller til og med nekte forespørsel utført på grunnlag av visse betingelser.

4. Sette opp RestTemplate

Nå som vi har opprettet interceptoren vår, la oss lage den RestTemplate bønne og legg interceptoren vår til den:

@Configuration public class RestClientConfig {@Bean public RestTemplate restTemplate () {RestTemplate restTemplate = new RestTemplate (); List interceptors = restTemplate.getInterceptors (); if (CollectionUtils.isEmpty (interceptors)) {interceptors = new ArrayList (); } interceptors.add (ny RestTemplateHeaderModifierInterceptor ()); restTemplate.setInterceptors (interceptors); retur hvile Template; }}

I noen tilfeller kan det være interceptors som allerede er lagt til RestTemplate gjenstand. Så for å sikre at alt fungerer som forventet, initialiserer koden vår bare interceptor-listen hvis den er tom.

Som koden vår viser, bruker vi standardkonstruktøren til å lage RestTemplate objekt, men det er noen scenarier der vi trenger å lese forespørselen / svarstrømmen to ganger.

For eksempel, hvis vi vil at avlyssneren vår skal fungere som en forespørsels- / svarlogger, må vi lese den to ganger - første gang av avlyssneren og den andre gangen av klienten.

Standardimplementeringen lar oss lese responsstrømmen bare en gang. For å imøtekomme slike spesifikke scenarier, tilbyr Spring en spesiell klasse kalt BufferingClientHttpRequestFactory. Som navnet antyder, vil denne klassen buffer forespørselen / svaret i JVM-minne for flerbruk.

Slik gjør du RestTemplate objektet initialiseres med BufferingClientHttpRequestFactory for å aktivere caching av forespørsel / responsstrøm:

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

5. Testing vårt eksempel

Her er JUnit-testsaken for å teste vår RestTemplate interceptor:

offentlig klasse RestTemplateItegrationTest {@Autowired RestTemplate restTemplate; @Test offentlig ugyldig gittRestTemplate_whenRequested_thenLogAndModifyResponse () {LoginForm loginForm = nytt LoginForm ("brukernavn", "passord"); HttpEntity requestEntity = ny HttpEntity (loginForm); HttpHeaders headers = nye HttpHeaders (); headers.setContentType (MediaType.APPLICATION_JSON); ResponseEntity responseEntity = restTemplate.postForEntity ("//httpbin.org/post", requestEntity, String.class); assertThat (responsEntity.getStatusCode (), er (equalTo (HttpStatus.OK))); assertThat (responseEntity.getHeaders (). get ("Foo"). get (0), is (equalTo ("bar"))); }}

Her har vi brukt den fritt hostede HTTP-forespørselen og responstjenesten //httpbin.orgfor å legge ut dataene våre. Denne testtjenesten vil returnere forespørselen vår sammen med noen metadata.

6. Konklusjon

Denne opplæringen handler om hvordan du setter opp en interceptor og legger den til RestTemplate gjenstand. Denne typen avlytter kan også brukes til å filtrere, overvåke og kontrollere innkommende forespørsler.

En vanlig brukstilfelle for en RestTemplate interceptor er toppmodifikasjonen - som vi har illustrert i detaljer i denne artikkelen.

Og som alltid kan du finne eksemplet på Github-prosjektet. Dette er et Maven-basert prosjekt, så det skal være enkelt å importere og kjøre som det er.


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