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.