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.


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