Proljetni filtri WebFlux

1. Pregled

Upotreba filtara široko je rasprostranjena u web aplikacijama jer nam daju način za izmjenu zahtjeva ili odgovora bez promjene naših krajnjih točaka.

U ovom brzom vodiču opisat ćemo moguće načine njihove primjene s WebFlux Frameworkom.

Budući da nećemo ulaziti u detalje o samom okviru WebFlux, možda biste htjeli pogledati ovaj članak za više detalja.

2. Ovisnost Mavena

Prije svega, proglasimo ovisnost WebFlux Maven:

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

3. Krajnje točke

Prvo moramo stvoriti neke krajnje točke. Po jedan za svaku metodu: temeljen na bilješkama i funkcionalno.

Počnimo s kontrolerom koji se temelji na bilješkama:

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

Za funkcionalnu krajnju točku prvo moramo stvoriti rukovatelj:

@Component javna klasa PlayerHandler {public Mono getName (ServerRequest request) {Mono name = Mono.just (request.pathVariable ("name")); return ok (). body (ime, String.class); }}

I također mapiranje konfiguracije usmjerivača:

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

4. Vrste WebFlux filtara

Okvir WebFlux pruža dvije vrste filtara: WebFilters i HandlerFilterFunctions.

Glavna razlika među njima je taWebFilter implementacije rade za sve krajnje točke iHandlerFilterFunction implementacije će raditi samo za Usmjerivač-osnovani.

4.1. WebFilter

Provest ćemo a WebFilter da biste dodali novo zaglavlje odgovoru. Kao rezultat, svi bi se odgovori trebali ponašati ovako:

@Component javna klasa ExampleWebFilter implementira WebFilter {@Override javni mono filtar (ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {serverWebExchange.getResponse () .getHeaders (). Add ("web-filter", "web-filter-test") vratiti webFilterChain.filter (serverWebExchange); }}

4.2. HandlerFilterFunction

Za ovaj implementiramo logiku koja postavlja HTTP status na ZABRANJENO kada je parametar „name“ jednak „test“.

javna klasa ExampleHandlerFilterFunction implementira HandlerFilterFunction {@Override javni mono filtar (ServerRequest serverRequest, HandlerFunction handlerFunction) {if (serverRequest.pathVariable ("name"). equalsIgnoreCase ("test")) {return ServerResponseD. status (FORBID). } return handlerFunction.handle (serverRequest); }}

5. Ispitivanje

U WebFlux Framework-u postoji jednostavan način za testiranje naših filtara: WebTestClient. Omogućuje nam testiranje HTTP poziva prema našim krajnjim točkama.

Evo primjera krajnje točke koja se temelji na bilješkama:

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

A za funkcionalnu krajnju točku:

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

6. Zaključak

U ovom smo priručniku pokrili obje vrste WebFlux filtara i pogledali neke primjere koda.

Za više informacija o WebFlux Frameworku pogledajte dokumentaciju.

Kao i uvijek, puni izvorni kod za primjere možete pronaći na GitHubu.


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