Používanie zachytávača Spring RestTemplate Interceptor

1. Prehľad

V tomto výučbe sa naučíme, ako implementovať jar RestTemplateStíhačka.

Prejdeme si príklad, v ktorom vytvoríme zachytávač, ktorý do odpovede pridá vlastnú hlavičku.

2. Scenáre použitia interceptora

Okrem úpravy hlavičky sú niektoré ďalšie prípady použitia, keď a RestTemplate interceptor je užitočný, sú:

  • Protokolovanie požiadaviek a odpovedí
  • Opakovanie požiadaviek pomocou konfigurovateľnej stratégie vypnutia
  • Zamietnutie žiadosti na základe určitých parametrov žiadosti
  • Zmena adresy URL žiadosti

3. Vytvorenie zachytávača

Vo väčšine programovacích paradigiem zachytávače sú podstatnou súčasťou, ktorá umožňuje programátorom riadiť vykonávanie zastavením. Jarný rámec podporuje aj rôzne zachytávače na rôzne účely.

Jar RestTemplate umožňuje nám pridať zachytávače, ktoré implementujú ClientHttpRequestInterceptor rozhranie. The zachytenie (HttpRequest, byte [], ClientHttpRequestExecution) metóda tohto rozhrania zachytí danú žiadosť a vráti odpoveď tým, že nám umožní prístup k žiadosť, telo a exekúcia predmety.

Budeme používať ClientHttpRequestExecution skutočný výkon a postúpiť žiadosť následnému reťazcu procesov.

Ako prvý krok vytvorme triedu zachytávača, ktorá implementuje ClientHttpRequestInterceptor rozhranie:

public class RestTemplateHeaderModifierInterceptor implementuje ClientHttpRequestInterceptor {@Override public ClientHttpResponse intercept (požiadavka HttpRequest, byte [] body, ClientHttpRequestExecution execution) hodí IOException {ClientHttpResponse response = execution.execute (request, body) response.getHeaders (). add ("Foo", "bar"); spätná odozva; }}

Náš zachytávač bude vyvolaný pri každej prichádzajúcej žiadostia pridá vlastnú hlavičku Foo na každú odpoveď, hneď ako sa vykonanie dokončí a vráti.

Keďže zachytiť () metóda zahŕňala žiadosť a telo ako argumenty je tiež možné na základe určitých podmienok vykonať akúkoľvek úpravu žiadosti alebo dokonca odmietnutie vykonania žiadosti.

4. Nastavenie RestTemplate

Teraz, keď sme vytvorili náš zachytávač, vytvorme RestTemplate fazuľa a pridajte k nej náš zachytávač:

@Configuration verejná trieda RestClientConfig {@Bean public RestTemplate restTemplate () {RestTemplate restTemplate = nový RestTemplate (); Zoznam zachytávačov = restTemplate.getInterceptors (); if (CollectionUtils.isEmpty (interceptors)) {interceptors = new ArrayList (); } interceptors.add (nový RestTemplateHeaderModifierInterceptor ()); restTemplate.setInterceptors (interceptory); návrat restTemplate; }}

V niektorých prípadoch môžu byť do antény už pridané zachytávače RestTemplate objekt. Aby sme sa uistili, že všetko funguje podľa očakávaní, náš kód inicializuje zoznam zachytávačov, iba ak je prázdny.

Ako ukazuje náš kód, na vytvorenie súboru používame predvolený konštruktor RestTemplate objekt, ale existujú niektoré scenáre, keď musíme dvakrát prečítať prúd žiadosť / odpoveď.

Napríklad, ak chceme, aby náš zachytávač fungoval ako záznamník požiadaviek / odpovedí, musíme si ho prečítať dvakrát - prvýkrát zachytávačom a druhýkrát klientom.

Predvolená implementácia nám umožňuje čítať stream odpovedí iba raz. Na zabezpečenie takýchto špecifických scenárov poskytuje Spring špeciálnu triedu s názvom BufferingClientHttpRequestFactory. Ako už názov napovedá, táto trieda bude ukladať požiadavku / odpoveď do pamäte JVM na viacnásobné použitie.

Tu je postup, ako RestTemplate objekt sa inicializuje pomocou BufferingClientHttpRequestFactory povolenie medzipamäti toku požiadaviek / odpovedí:

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

5. Testovanie nášho príkladu

Tu je testovací prípad JUnit na testovanie nášho RestTemplate stíhačka:

verejná trieda RestTemplateItegrationTest {@Autowired RestTemplate restTemplate; @Test public void givenRestTemplate_whenRequested_thenLogAndModifyResponse () {LoginForm loginForm = nový LoginForm ("používateľské meno", "heslo"); HttpEntity requestEntity = nový HttpEntity (loginForm); Hlavičky HttpHeaders = nové HttpHeaders (); headers.setContentType (MediaType.APPLICATION_JSON); ResponseEntity responseEntity = restTemplate.postForEntity ("//httpbin.org/post", requestEntity, String.class); assertThat (responseEntity.getStatusCode (), je (equalTo (HttpStatus.OK))); assertThat (responseEntity.getHeaders (). get ("Foo"). get (0), is (equalTo ("bar"))); }}

Tu sme použili voľne hostenú službu HTTP pre žiadosti a odpovede //httpbin.orgaby sme zverejnili naše údaje. Táto testovacia služba vráti náš text žiadosti spolu s niekoľkými metadátami.

6. Záver

Tento tutoriál je o tom, ako nastaviť zachytávač a pridať ho do RestTemplate objekt. Tento druh zachytávačov je možné použiť aj na filtrovanie, sledovanie a kontrolu prichádzajúcich požiadaviek.

Bežný prípad použitia pre a RestTemplate interceptor je úprava hlavičky - ktorú sme si podrobne ilustrovali v tomto článku.

A ako vždy, vzorový kód nájdete v projekte Github. Toto je projekt založený na Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


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