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.