Brug af Spring RestTemplate Interceptor

1. Oversigt

I denne vejledning vil vi lære at implementere en forår RestTemplateInterceptor.

Vi gennemgår et eksempel, hvor vi opretter en interceptor, der tilføjer en brugerdefineret header til svaret.

2. Interceptor-brugsscenarier

Udover ændring af header er nogle af de andre brugssager, hvor en RestTemplate interceptor er nyttig er:

  • Logning af anmodning og svar
  • Forsøger anmodningerne igen med en konfigurerbar back off-strategi
  • Anmod om afvisning baseret på visse anmodningsparametre
  • Ændring af anmodningens URL-adresse

3. Oprettelse af interceptor

I de fleste programmeringsparadigmer, interceptors er en vigtig del, der gør det muligt for programmører at kontrollere udførelsen ved at opfange den. Spring framework understøtter også en række interceptors til forskellige formål.

Forår RestTemplate giver os mulighed for at tilføje interceptors, der implementeres ClientHttpRequestInterceptor interface. Det aflytning (HttpRequest, byte [], ClientHttpRequestExecution) Metoden til denne grænseflade opfanger den givne anmodning og returnerer svaret ved at give os adgang til anmodning, legeme og udførelse genstande.

Vi bruger ClientHttpRequestExecution argument for at udføre den faktiske udførelse og videresende anmodningen til den efterfølgende proceskæde.

Lad os som et første trin oprette en interceptor-klasse, der implementerer ClientHttpRequestInterceptor grænseflade:

offentlig klasse RestTemplateHeaderModifierInterceptor implementerer ClientHttpRequestInterceptor {@Override offentlig ClientHttpResponse aflytning (HttpRequest anmodning, byte [] body, ClientHttpRequestExecution udførelse) kaster IOException {ClientHttpResponse svar = udførelse.execute (anmodning, body); respons.getHeaders (). tilføj ("Foo", "bar"); tilbagevenden svar }}

Vores interceptor påkaldes for hver indgående anmodning, og det tilføjer et brugerdefineret overskrift Foo til hvert svar, når udførelsen er afsluttet og vender tilbage.

Siden den aflytte () metoden inkluderet anmodning og legeme som argumenter er det også muligt at foretage enhver ændring af anmodningen eller endda nægte anmodningens udførelse baseret på visse betingelser.

4. Opsætning af RestTemplate

Nu hvor vi har oprettet vores interceptor, lad os oprette RestTemplate bønne og tilføj vores interceptor til den:

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

I nogle tilfælde kan der være interceptors, der allerede er føjet til RestTemplate objekt. Så for at sikre, at alt fungerer som forventet, initialiserer vores kode kun interceptor-listen, hvis den er tom.

Som vores kode viser, bruger vi standardkonstruktøren til at oprette RestTemplate objekt, men der er nogle scenarier, hvor vi skal læse anmodnings- / svarstrømmen to gange.

For eksempel, hvis vi ønsker, at vores interceptor skal fungere som en anmodnings- / svarlogger, er vi nødt til at læse det to gange - første gang af interceptoren og anden gang af klienten.

Standardimplementeringen giver os kun mulighed for at læse svarstrømmen en gang. For at imødekomme sådanne specifikke scenarier giver Spring en speciel klasse kaldet BufferingClientHttpRequestFactory. Som navnet antyder, vil denne klasse buffer anmodningen / svaret i JVM-hukommelse til flere anvendelser.

Sådan gør du RestTemplate objektet initialiseres ved hjælp af BufferingClientHttpRequestFactory for at aktivere caching af anmodning / svarstrøm:

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

5. Test af vores eksempel

Her er JUnit test tilfælde til test af vores RestTemplate interceptor:

offentlig klasse RestTemplateItegrationTest {@Autowired RestTemplate restTemplate; @Test offentligt ugyldigt givetRestTemplate_whenRequested_thenLogAndModifyResponse () {LoginForm loginForm = nyt LoginForm ("brugernavn", "adgangskode"); 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 (responsEntity.getHeaders (). get ("Foo"). get (0), er (equalTo ("bar"))); }}

Her har vi brugt den frit hostede HTTP-anmodning og svartjeneste //httpbin.orgat sende vores data. Denne testtjeneste returnerer vores anmodningsorgan sammen med nogle metadata.

6. Konklusion

Denne vejledning handler om, hvordan man opsætter en interceptor og tilføjer den til RestTemplate objekt. Denne form for interceptors kan også bruges til filtrering, overvågning og kontrol af indgående anmodninger.

En almindelig brugssag til en RestTemplate interceptor er header-modifikationen - som vi har illustreret detaljeret i denne artikel.

Og som altid kan du finde eksempelkoden over på Github-projektet. Dette er et Maven-baseret projekt, så det skal være let at importere og køre som det er.


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