Jarné filtre WebFlux

1. Prehľad

Používanie filtrov je vo webových aplikáciách rozšírené, pretože nám umožňujú upraviť požiadavku alebo odpoveď bez zmeny našich koncových bodov.

V tomto rýchlom výučbe si popíšeme možné spôsoby ich implementácie s WebFlux Framework.

Pretože nebudeme zachádzať do podrobností o samotnom rámci WebFlux, možno budete chcieť pozrieť ďalšie podrobnosti v tomto článku.

2. Závislosť od Maven

Najskôr deklarujme závislosť WebFlux Maven:

 org.springframework.boot spring-boot-starter-webflux 

3. Koncové body

Najprv musíme vytvoriť nejaké koncové body. Jeden pre každú metódu: založený na anotáciách a založený na funkcii.

Začnime radičom založeným na anotáciách:

@GetMapping (path = "/ users / {name}") public Mono getName (@PathVariable String name) {return Mono.just (name); }

Pre funkčný koncový bod musíme najskôr vytvoriť obslužnú rutinu:

@ Komponenta verejná trieda PlayerHandler {verejné Mono getName (požiadavka ServerRequest) {Mono meno = Mono.just (request.pathVariable ("meno")); return ok (). body (name, String.class); }}

A tiež mapovanie konfigurácie smerovača:

@Bean public RouterFunction route (PlayerHandler playerHandler) {return RouterFunctions .route (GET ("/ players / {name}"), playerHandler :: getName) .filter (new ExampleHandlerFilterFunction ()); }

4. Typy filtrov WebFlux

Rámec WebFlux poskytuje dva typy filtrov: WebFilters a HandlerFilterFunctions.

Hlavný rozdiel medzi nimi je v tomWebFilter implementácie fungujú pre všetky koncové body aHandlerFilterFunction implementácie budú fungovať iba pre Router- na základe.

4.1. WebFilter

Implementujeme WebFilter ak chcete do odpovede pridať novú hlavičku. Vo výsledku by všetky odpovede mali mať toto správanie:

@ Komponenta verejná trieda ExampleWebFilter implementuje WebFilter {@Override verejný Mono filter (ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {serverWebExchange.getResponse () .getHeaders (). Add ("web-filter", "web-filter-test"); návrat webFilterChain.filter (serverWebExchange); }}

4.2. HandlerFilterFunction

Pre tento implementujeme logiku, ktorá nastavuje stav HTTP na ZAKÁZANÉ keď sa parameter „name“ rovná „test“.

verejná trieda ExampleHandlerFilterFunction implementuje HandlerFilterFunction {@Override public Mono filter (ServerRequest serverRequest, HandlerFunction handlerFunction) {if (serverRequest.pathVariable ("name"). equalsIgnoreCase ("test")) {return ServerResponse.status (FORBIDDEN). } return handlerFunction.handle (serverRequest); }}

5. Testovanie

V rámci WebFlux Framework je jednoduchý spôsob, ako otestovať naše filtre: WebTestClient. Umožňuje nám testovať hovory HTTP do našich koncových bodov.

Tu sú príklady koncového bodu založeného na anotáciách:

@Test public void whenUserNameIsBaeldung_thenWebFilterIsApplied () {EntityExchangeResult result = webTestClient.get () .uri ("/ users / baeldung") .exchange () .expectStatus (). IsOk () .expectBody (String.class) .return assertEquals (result.getResponseBody (), "baeldung"); assertEquals (result.getResponseHeaders (). getFirst ("web-filter"), "web-filter-test"); } @Test public void whenUserNameIsTest_thenHandlerFilterFunctionIsNotApplied () {webTestClient.get (). Uri ("/ users / test") .exchange () .expectStatus (). IsOk (); }

A pre funkčný koncový bod:

@Test public void whenPlayerNameIsBaeldung_thenWebFilterIsApplied () {EntityExchangeResult result = webTestClient.get () .uri ("/ players / baeldung") .exchange () .expectStatus (). IsOk () .expectBody (String.class) .return assertEquals (result.getResponseBody (), "baeldung"); assertEquals (result.getResponseHeaders (). getFirst ("web-filter"), "web-filter-test"); } @Test public void whenPlayerNameIsTest_thenHandlerFilterFunctionIsApplied () {webTestClient.get (). Uri ("/ players / test") .exchange () .expectStatus (). IsForbidden (); }

6. Záver

V tejto príručke sme sa venovali obidvom typom filtrov WebFlux a pozreli sme sa na niektoré príklady kódu.

Viac informácií o rámci WebFlux nájdete v dokumentácii.

Celý zdrojový kód príkladov nájdete ako vždy na serveri GitHub.


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