Forår WebFlux-filtre

1. Oversigt

Brugen af ​​filtre er udbredt i webapplikationer, da de giver os en måde at ændre en anmodning eller et svar uden at ændre vores slutpunkter.

I denne hurtige vejledning beskriver vi mulige måder at implementere dem på med WebFlux Framework.

Da vi ikke går nærmere ind på selve WebFlux-rammen, kan du tjekke denne artikel for at få flere detaljer.

2. Maven-afhængighed

Lad os først og fremmest erklære WebFlux Maven-afhængighed:

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

3. Slutpunkter

Vi skal først oprette nogle slutpunkter. Én for hver metode: annotationsbaseret og funktionel-baseret.

Lad os starte med den annoteringsbaserede controller:

@GetMapping (sti = "/ brugere / {navn}") offentlig Mono getName (@PathVariable strengnavn) {returner Mono.just (navn); }

For det funktionelle slutpunkt skal vi først oprette en handler:

@Komponent offentlig klasse PlayerHandler {public Mono getName (ServerRequest anmodning) {Mono name = Mono.just (request.pathVariable ("name")); returner ok (). body (navn, String.class); }}

Og også en routerkonfigurationskortlægning:

@Bean offentlig RouterFunction-rute (PlayerHandler playerHandler) {returner RouterFunctions .route (GET ("/ players / {name}"), playerHandler :: getName) .filter (nyt eksempelHandlerFilterFunction ()); }

4. Typer af WebFlux-filtre

WebFlux-rammen indeholder to typer filtre: WebFilters og HandlerFilterFunktioner.

Den største forskel mellem dem er, atWebFilter implementeringer fungerer for alle slutpunkter ogHandlerFilterFunction implementeringer fungerer kun for Router-baserede.

4.1. WebFilter

Vi implementerer en WebFilter for at tilføje en ny overskrift til svaret. Som et resultat skal alle svar have denne adfærd:

@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

Til denne implementerer vi en logik, der indstiller HTTP-status til FORBUDT når parameteren “navn” er lig med “test”.

public class EksempelHandlerFilterFunction implementerer HandlerFilterFunction {@Override public Mono filter (ServerRequest serverRequest, HandlerFunction handlerFunction) {if (serverRequest.pathVariable ("name"). equalsIgnoreCase ("test")) {return ServerResponse.status (FORBIDD;). } returnerer handlerFunction.handle (serverRequest); }}

5. Testning

I WebFlux Framework er der en nem måde at teste vores filtre på: WebTestClient. Det giver os mulighed for at teste HTTP-opkald til vores slutpunkter.

Her er eksempler på det annoteringsbaserede slutpunkt:

@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 ("/ brugere / test") .exchange () .expectStatus (). IsOk (); }

Og for det funktionelle slutpunkt:

@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 ("/ spillere / test") .exchange () .expectStatus (). ErForbidden (); }

6. Konklusion

Vi har dækket begge typer WebFlux-filtre i denne vejledning og kigget på nogle kodeeksempler.

For mere information om WebFlux Framework, se dokumentationen.

Som altid kan den fulde kildekode til eksemplerne findes på GitHub.


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