Kako postaviti zaglavlje na odgovor s proljećem 5

1. Pregled

U ovom brzom vodiču, proći ćemo kroz različite načine postavljanja zaglavlja na odgovor usluge, bilo za nereaktivne krajnje točke ili za API-je koji koriste Springov okvir 5 WebFlux.

Daljnje informacije o ovom okviru možemo pronaći u prethodnim postovima.

2. Zaglavlja za nereaktivne komponente

Ako želimo postaviti zaglavlja na pojedinačne odgovore, možemo ih koristiti HttpServletResponse ili ResponseEntity predmeta.

S druge strane, ako je naš cilj dodati filtar svim ili više odgovora, morat ćemo konfigurirati a filtar.

2.1. Koristeći HttpServletResponse

Jednostavno moramo dodati HttpServletResponse prigovoriti našoj REST krajnjoj točki kao argument, a zatim upotrijebite addHeader () metoda:

@GetMapping ("/ http-servlet-response") javni niz pomoću HttpServletResponse (HttpServletResponse response) {response.addHeader ("Baeldung-Example-Header", "Value-HttpServletResponse"); return "Odgovor sa zaglavljem pomoću HttpServletResponse"; }

Kao što je prikazano u primjeru, ne moramo vratiti objekt odgovora.

2.2. Koristeći ResponseEntity

U ovom slučaju, upotrijebimo Bodibilder koje pruža ResponseEntity razred:

@GetMapping ("/ response-entity-builder-with-http-headers") javni ResponseEntity usingResponseEntityBuilderAndHttpHeaders () {HttpHeaders responseHeaders = novi HttpHeaders (); responseHeaders.set ("Baeldung-Example-Header", "Value-ResponseEntityBuilderWithHttpHeaders"); return ResponseEntity.ok () .headers (responseHeaders) .body ("Odgovor zaglavljem pomoću ResponseEntity"); }

The HttpHeaders class nudi obilje praktičnih metoda za postavljanje najčešćih zaglavlja.

Više primjera koji ilustriraju ove točke možemo vidjeti u našem Github repo-u.

2.3. Dodavanje zaglavlja za sve odgovore

Sada zamislimo da želimo postaviti određeno zaglavlje mnogim našim krajnjim točkama.

Naravno, bilo bi frustrirajuće ako moramo ponoviti prethodni kôd na svakoj metodi mapiranja.

Bolji pristup da se to postigne je konfiguriranje a filtar u našoj službi:

@WebFilter ("/ filter-response-header / *") javna klasa AddResponseHeaderFilter implementira Filter {@Override public void doFilter (ServletRequest zahtjev, ServletResponse response, FilterChain chain) baca IOException, ServletException {HttpServsenResponserServsereServsenResponserServServServServServServServServServServServServServServServServServServServServServServServServServServServServServServSrvServSrvServsetSrvServletServsetreserset httpServletResponse.setHeader ("Baeldung-Primjer-Zaglavlje filtra", "Vrijednost-Filter"); chain.doFilter (zahtjev, odgovor); } @Override public void init (FilterConfig filterConfig) baca ServletException {// ...} @Override public void uništavanje () {// ...}}

The @WebFilter napomena nam omogućuje da naznačimo urlPatterns za koju ovo filtar postat će učinkoviti.

Kao što smo istakli u ovom članku, kako bi naš filtar otkriven do proljeća, moramo dodati @ServletComponentScan napomena za našu klasu Spring Application:

@ServletComponentScan @SpringBootApplication javna klasa ResponseHeadersApplication {javna statička void glavna (String [] args) {SpringApplication.run (ResponseHeadersApplication.class, args); }}

Ovaj posljednji korak možemo izbjeći ako nam ne treba nijedna funkcionalnost koju pruža @WebFilter, pomoću @Komponenta bilješka u našem filtar razred umjesto toga.

3. Zaglavlja za reaktivne krajnje točke

Ponovno ćemo vidjeti kako postaviti zaglavlja na pojedinačne odgovore krajnje točke pomoću ServerHttpResponse, ResponseEntity ili ServerResponse (za funkcionalne krajnje točke) klase i sučelja.

Također ćemo naučiti kako implementirati Spring 5 WebFilter da dodate zaglavlje na sve naše odgovore.

3.1. Koristeći ServerHttpResponse

Ovaj je pristup prilično sličan HttpServletResponse kolega:

@GetMapping ("/ server-http-response") javni Mono usingServerHttpResponse (ServerHttpResponse response) {response.getHeaders (). Add ("Baeldung-Example-Header", "Value-ServerHttpResponse"); return Mono.just ("Odgovor zaglavljem pomoću ServerHttpResponse"); }

3.2. Koristeći ResponseEntity

Možemo koristiti ResponseEntity klase točno onako kako to radimo za nereaktivne krajnje točke:

@GetMapping ("/ response-entity") javni Mono usingResponseEntityBuilder () {String responseHeaderKey = "Baeldung-Example-Header"; String responseHeaderValue = "Value-ResponseEntityBuilder"; String responseBody = "Odgovor zaglavljem pomoću ResponseEntity (graditelj)"; vrati Mono.just (ResponseEntity.ok () .header (responseHeaderKey, responseHeaderValue) .body (responseBody)); }

3.3. Koristeći ServerResponse

Klase i sučelja uvedena u posljednja dva pododjeljka mogu se koristiti u @Controller komentirane klase, ali nisu prikladne za novi Spring 5 Functional Web Framework.

Ako želimo za postavljanje zaglavlja na HandlerFunction onda ćemo se morati dočepati ServerResponsesučelje:

javni Mono useHandler (konačni zahtjev za ServerRequest) {return ServerResponse.ok () .header ("Baeldung-Example-Header", "Value-Handler") .body (Mono.just ("Response with header using Handler"), String. razred); }

3.4. Dodavanje zaglavlja za sve odgovore

Posljednje, Proljeće 5 pruža a WebFilter sučeljeza postavljanje zaglavlja na sve odgovore dohvaćen od usluge:

@Component javna klasa AddResponseHeaderWebFilter implementira WebFilter {@Override javni mono filtar (razmjena ServerWebExchange, lanac WebFilterChain) {exchange.getResponse () .getHeaders () .add ("Baeldung-Example-Filter-Header"; "Value-Filter"); povratni lanac.filter (razmjena); }}

4. Zaključak

U zaključku smo naučili mnogo različitih načina postavljanja zaglavlja na odgovor, bilo ako ga želimo postaviti na jednu krajnju točku ili ako želimo konfigurirati sve naše API-je za ostatak, čak i ako prelazimo na reaktivni stog , sada imamo znanje da radimo sve te stvari.

Kao i uvijek, svim primjerima može se pristupiti u našem spremištu Github, kako nereaktivnim, tako i onima koji koriste specifične funkcije Spring 5.