Våren WebFlux-filtre
1. Oversikt
Bruken av filtre er utbredt i webapplikasjoner, siden de gir oss en måte å endre en forespørsel eller svar uten å endre endepunktene våre.
I denne raske opplæringen beskriver vi mulige måter å implementere dem på med WebFlux Framework.
Siden vi ikke vil gå inn på detaljer om selve WebFlux-rammeverket, vil du kanskje sjekke ut denne artikkelen for mer informasjon.
2. Maven avhengighet
Først og fremst, la oss erklære WebFlux Maven-avhengighet:
org.springframework.boot spring-boot-starter-webflux
3. Endepunkter
Vi må opprette noen endepunkter først. Én for hver metode: kommentarbasert og funksjonsbasert.
La oss starte med den kommentarbaserte kontrolleren:
@GetMapping (sti = "/ brukere / {navn}") offentlig Mono getName (@PathVariable strengnavn) {return Mono.just (navn); }
For det funksjonelle endepunktet må vi først opprette en behandler:
@Component public class PlayerHandler {public Mono getName (ServerRequest request) {Mono name = Mono.just (request.pathVariable ("name")); returner ok (). body (name, String.class); }}
Og også en rutekonfigurasjonskartlegging:
@Bean offentlig RouterFunction-rute (PlayerHandler playerHandler) {retur RouterFunctions .route (GET ("/ players / {name}"), playerHandler :: getName) .filter (nytt eksempelHandlerFilterFunction ()); }
4. Typer WebFlux-filtre
WebFlux-rammeverket tilbyr to typer filtre: WebFilters og HandlerFilterFunctions.
Hovedforskjellen mellom dem er atWebFilter implementeringer fungerer for alle sluttpunkter ogHandlerFilterFunction implementeringer vil bare fungere for Ruter-baserte.
4.1. WebFilter
Vi implementerer en WebFilter for å legge til en ny overskrift i svaret. Som et resultat bør alle svarene ha denne oppførselen:
@Komponent offentlig klasse EksempelWebFilter implementerer WebFilter {@Override public Mono filter (ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {serverWebExchange.getResponse () .getHeaders (). Add ("web-filter", "web-filter-test"); returner webFilterChain.filter (serverWebExchange); }}
4.2. HandlerFilterFunction
For denne implementerer vi en logikk som setter HTTP-status til FORBUDT når “navn” -parameteren er lik “test”.
offentlig klasse ExampleHandlerFilterFunction implementerer HandlerFilterFunction {@Override public Mono filter (ServerRequest serverRequest, HandlerFunction handlerFunction) {if (serverRequest.pathVariable ("name"). equalsIgnoreCase ("test")) {return ServerResponse.status (FORBIDD;). } returner handlerFunction.handle (serverRequest); }}
5. Testing
I WebFlux Framework er det en enkel måte å teste filtrene våre på: WebTestClient. Det lar oss teste HTTP-anrop til endepunktene våre.
Her er eksempler på det kommentarbaserte endepunktet:
@Test offentlig ugyldig nårUserNameIsBaeldung_thenWebFilterIsApplied () {EntityExchangeResult result = webTestClient.get () .uri ("/ users / baeldung") .exchange () .expectStatus (). IsOk () .expectBody (String.class) .returnResult) assertEquals (result.getResponseBody (), "baeldung"); assertEquals (result.getResponseHeaders (). getFirst ("web-filter"), "web-filter-test"); } @Test offentlig ugyldig nårUserNameIsTest_thenHandlerFilterFunctionIsNotApplied () {webTestClient.get (). Uri ("/ users / test") .exchange () .expectStatus (). IsOk (); }
Og for det funksjonelle endepunktet:
@Test offentlig ugyldig nårPlayerNameIsBaeldung_thenWebFilterIsApplied () {EntityExchangeResult result = webTestClient.get () .uri ("/ players / baeldung") .exchange () .expectStatus (). IsOk () .expectBody (String.class); returnResult assertEquals (result.getResponseBody (), "baeldung"); assertEquals (result.getResponseHeaders (). getFirst ("web-filter"), "web-filter-test"); } @Test offentlig ugyldig nårPlayerNameIsTest_thenHandlerFilterFunctionIsApplied () {webTestClient.get (). Uri ("/ players / test") .exchange () .expectStatus (). IsForbidden (); }
6. Konklusjon
Vi har dekket begge typene WebFlux-filtre i denne opplæringen, og har sett på noen kodeeksempler.
For mer informasjon om WebFlux Framework, se på dokumentasjonen.
Som alltid kan hele kildekoden for eksemplene finnes på GitHub.