A Spring RestTemplate Interceptor használata

1. Áttekintés

Ebben az oktatóanyagban megtanuljuk a tavasz megvalósítását RestTemplateElfogó.

Megyünk egy példát, amelyben létrehozunk egy elfogót, amely egyéni fejlécet ad a válaszhoz.

2. Elfogóhasználati forgatókönyvek

A fejléc módosítása mellett néhány más olyan felhasználási eset is előfordulhat, amikor a RestTemplate elfogó hasznos:

  • Kérés és válasz naplózása
  • A kérések újrapróbálkozása konfigurálható visszalépési stratégiával
  • Kérelem elutasítása bizonyos kérési paraméterek alapján
  • A kérelem URL-címének módosítása

3. Az elfogó létrehozása

A legtöbb programozási paradigmában az elfogók elengedhetetlen részek, amelyek lehetővé teszik a programozók számára, hogy elfogásával ellenőrizzék a végrehajtást. A tavaszi keretrendszer számos elfogót támogat különböző célokra.

Tavaszi RestTemplate lehetővé teszi számunkra, hogy olyan elfogókat adjunk, amelyek megvalósítják ClientHttpRequestInterceptor felület. A elfogás (HttpRequest, byte [], ClientHttpRequestExecution) Ennek az interfésznek a módja elfogja az adott kérést és visszaadja a választ azáltal, hogy hozzáférést biztosít a kérés, test és végrehajtás tárgyakat.

Használjuk a ClientHttpRequestExecution argumentum a tényleges végrehajtás elvégzéséhez, és továbbítja a kérést a következő folyamatláncnak.

Első lépésként hozzunk létre egy elfogó osztályt, amely megvalósítja a ClientHttpRequestInterceptor felület:

public class RestTemplateHeaderModifierInterceptor implementálja a ClientHttpRequestInterceptor {@Orride public ClientHttpResponse intercept (HttpRequest kérés, bájt [] body, ClientHttpRequestExecution végrehajtás) dobja az IOException {ClientHttpResponute response (végrehajtás.ex); response.getHeaders (). add ("Foo", "bar"); visszatérési válasz; }}

Elfogónkat minden beérkező kérés esetén felhívjuk, és hozzáad egy egyéni fejlécet Foo minden válaszra, amint a végrehajtás befejeződik és visszatér.

Mivel a lehallgatás () módszer magában foglalta a kérés és test érvként bármilyen módosítást megtehet a kérelemen, vagy bizonyos feltételek alapján akár megtagadhatja is a kérés végrehajtását.

4. A RestTemplate

Most, hogy létrehoztuk az elfogónkat, hozzuk létre a RestTemplate babot, és adjuk hozzá az elfogónkat:

@Configuration public class RestClientConfig {@Bean public RestTemplate restTemplate () {RestTemplate restTemplate = new RestTemplate (); Elfogók listája = restTemplate.getInterceptors (); if (CollectionUtils.isEmpty (interceptors)) {interceptors = new ArrayList (); } interceptors.add (új RestTemplateHeaderModifierInterceptor ()); restTemplate.setInterceptors (elfogók); return restTemplate; }}

Bizonyos esetekben előfordulhat, hogy az elfogókat már hozzáadták a programhoz RestTemplate tárgy. Tehát annak biztosítása érdekében, hogy minden a várt módon működjön, kódunk csak akkor inicializálja az elfogó listát, ha üres.

Ahogy a kódunk is mutatja, az alapértelmezett konstruktort használjuk a RestTemplate objektum, de vannak olyan esetek, amikor kétszer el kell olvasnunk a kérés / válasz folyamot.

Például, ha azt akarjuk, hogy az elfogónk kérés / válasz naplóként működjön, akkor kétszer is el kell olvasnunk - először az elfogó, másodszor pedig az ügyfél.

Az alapértelmezett megvalósítás lehetővé teszi számunkra, hogy a válaszfolyamot csak egyszer olvassuk el. Az ilyen speciális forgatókönyvek kielégítésére Spring egy speciális osztályt nevez BufferingClientHttpRequestFactory. Ahogy a neve is mutatja, ez az osztály többszörös használatra pufferolja a kérést / választ a JVM memóriájában.

Itt van, hogyan RestTemplate objektum inicializálása BufferingClientHttpRequestFactory a kérelem / válasz folyam gyorsítótárának engedélyezéséhez:

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

5. Példánk tesztelése

Itt van a JUnit tesztesete a teszteléshez RestTemplate elfogó:

public class RestTemplateItegrationTest {@Autowired RestTemplate restTemplate; @Test public void givenRestTemplate_whenRequested_thenLogAndModifyResponse () {LoginForm loginForm = new LoginForm ("felhasználónév", "jelszó"); HttpEntity requestEntity = új HttpEntity (loginForm); HttpHeaders fejlécek = new HttpHeaders (); fejlécek.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"))); }}

Itt a szabadon hosztolt HTTP kérés és válasz szolgáltatást használtuk //httpbin.orghogy közzé tegyük adatainkat. Ez a tesztszolgáltatás néhány metaadattal együtt visszaküldi a kéréstestünket.

6. Következtetés

Ez az oktatóanyag arról szól, hogyan állítsanak be egy elfogót és adják hozzá a RestTemplate tárgy. Ez a fajta elfogó a bejövő kérések szűrésére, monitorozására és ellenőrzésére is használható.

Gyakori használati eset a RestTemplate interceptor a fejléc módosítása - amelyet részletesen bemutattunk ebben a cikkben.

És mint mindig, itt is megtalálhatja a példakódot a Github projekten. Ez egy Maven-alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.


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