Met behulp van de Spring RestTemplate Interceptor

1. Overzicht

In deze tutorial gaan we leren hoe we een Spring kunnen implementeren RestTemplateOnderschepper.

We zullen een voorbeeld doornemen waarin we een interceptor zullen maken die een aangepaste koptekst aan het antwoord toevoegt.

2. Gebruiksscenario's voor onderscheppers

Naast het aanpassen van de koptekst, waren enkele van de andere use-cases een RestTemplate interceptor is handig zijn:

  • Logboekregistratie van verzoeken en antwoorden
  • De verzoeken opnieuw proberen met een configureerbare back-off-strategie
  • Verzoek weigering op basis van bepaalde verzoekparameters
  • Het verzoek-URL-adres wijzigen

3. Creëren van de Interceptor

In de meeste programmeerparadigma's, interceptors zijn een essentieel onderdeel waarmee programmeurs de uitvoering kunnen controleren door deze te onderscheppen. Spring-raamwerk ondersteunt ook een verscheidenheid aan interceptors voor verschillende doeleinden.

Voorjaar RestTemplate stelt ons in staat om interceptors toe te voegen die implementeren ClientHttpRequestInterceptor koppel. De onderscheppen (HttpRequest, byte [], ClientHttpRequestExecution) methode van deze interface onderschept het gegeven verzoek en retourneert het antwoord door ons toegang te geven tot het verzoek, lichaam en executie voorwerpen.

We gebruiken de ClientHttpRequestExecution argument om de daadwerkelijke uitvoering te doen, en het verzoek door te geven aan de volgende procesketen.

Laten we als eerste stap een interceptorklasse maken die de ClientHttpRequestInterceptor koppel:

openbare klasse RestTemplateHeaderModifierInterceptor implementeert ClientHttpRequestInterceptor {@Override openbare ClientHttpResponse onderscheppen (HttpRequest-verzoek, byte [] body, ClientHttpRequestExecution uitvoering) gooit IOException {ClientHttpResponse response = execution.execute (request, body); response.getHeaders (). add ("Foo", "bar"); antwoord teruggeven; }}

Onze interceptor wordt opgeroepen voor elk binnenkomend verzoek, en het zal een aangepaste koptekst toevoegen Foo op elk antwoord, zodra de uitvoering is voltooid en terugkeert.

Sinds de onderscheppen() methode omvatte de verzoek en lichaam Als argumenten is het ook mogelijk om elke wijziging aan het verzoek aan te brengen of zelfs de uitvoering van het verzoek te weigeren op basis van bepaalde voorwaarden.

4. Het instellen van het RestTemplate

Nu we onze interceptor hebben gemaakt, gaan we de RestTemplate bean en voeg onze interceptor eraan toe:

@Configuration openbare klasse RestClientConfig {@Bean openbare RestTemplate restTemplate () {RestTemplate restTemplate = nieuwe RestTemplate (); Lijst interceptors = restTemplate.getInterceptors (); if (CollectionUtils.isEmpty (interceptors)) {interceptors = nieuwe ArrayList (); } interceptors.add (nieuwe RestTemplateHeaderModifierInterceptor ()); restTemplate.setInterceptors (onderscheppers); terug restTemplate; }}

In sommige gevallen zijn er mogelijk al interceptors toegevoegd aan het RestTemplate voorwerp. Dus om er zeker van te zijn dat alles werkt zoals verwacht, zal onze code de onderscheppingslijst alleen initialiseren als deze leeg is.

Zoals onze code laat zien, gebruiken we de standaardconstructor om de RestTemplate object, maar er zijn enkele scenario's waarin we de verzoek- / antwoordstroom twee keer moeten lezen.

Als we bijvoorbeeld willen dat onze interceptor functioneert als een request / response-logger, dan moeten we het twee keer lezen - de eerste keer door de interceptor en de tweede keer door de client.

Met de standaardimplementatie kunnen we de responsstream slechts één keer lezen. Om in dergelijke specifieke scenario's te voorzien, biedt Spring een speciale klasse genaamd BufferingClientHttpRequestFactory. Zoals de naam suggereert, zal deze klasse het verzoek / antwoord in JVM-geheugen bufferen voor meervoudig gebruik.

Hier is hoe de RestTemplate object wordt geïnitialiseerd met BufferingClientHttpRequestFactory om het cachen van de verzoek- / antwoordstroom in te schakelen:

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

5. Ons voorbeeld testen

Hier is de JUnit-testcase voor het testen van onze RestTemplate onderschepper:

openbare klasse RestTemplateItegrationTest {@Autowired RestTemplate restTemplate; @Test openbare ongeldig gegevenRestTemplate_whenRequested_thenLogAndModifyResponse () {LoginForm loginForm = nieuw LoginForm ("gebruikersnaam", "wachtwoord"); HttpEntity requestEntity = nieuwe HttpEntity (loginForm); HttpHeaders headers = nieuwe HttpHeaders (); headers.setContentType (MediaType.APPLICATION_JSON); ResponseEntity responseEntity = restTemplate.postForEntity ("//httpbin.org/post", requestEntity, String.class); assertThat (responseEntity.getStatusCode (), is (equalTo (HttpStatus.OK))); assertThat (responseEntity.getHeaders (). get ("Foo"). get (0), is (equalTo ("bar"))); }}

Hier hebben we de gratis gehoste HTTP-verzoek- en responsservice //httpbin.org gebruiktom onze gegevens te plaatsen. Deze testservice retourneert onze aanvraagtekst samen met enkele metagegevens.

6. Conclusie

Deze tutorial gaat helemaal over het opzetten van een interceptor en het toevoegen aan het RestTemplate voorwerp. Dit soort interceptors kunnen ook worden gebruikt voor het filteren, bewaken en besturen van de inkomende verzoeken.

Een veel voorkomende use-case voor een RestTemplate interceptor is de header-wijziging - die we in dit artikel in detail hebben geïllustreerd.

En, zoals altijd, kun je de voorbeeldcode vinden op het Github-project. Dit is een op Maven gebaseerd project, dus het zou gemakkelijk moeten kunnen worden geïmporteerd en uitgevoerd zoals het is.