Sådan indstilles en header på et svar med foråret 5

1. Oversigt

I denne hurtige vejledning vi gennemgår forskellige måder at indstille en header på et servicerespons på, enten til ikke-reaktive slutpunkter eller til API'er, der bruger Spring's 5 WebFlux framework.

Vi kan finde yderligere oplysninger om denne ramme i tidligere indlæg.

2. Overskrifter til ikke-reaktive komponenter

Hvis vi vil indstille overskrifter på enkelte svar, kan vi bruge HttpServletResponse eller SvarEnhed genstande.

På den anden side, hvis vores mål er at tilføje et filter til alle eller flere svar, skal vi konfigurere en Filter.

2.1. Ved brug af HttpServletResponse

Vi er simpelthen nødt til at tilføje HttpServletResponse gør indsigelse mod vores REST-slutpunkt som et argument, og brug derefter addHeader () metode:

@GetMapping ("/ http-servlet-respons") offentlig streng ved hjælp afHttpServletResponse (HttpServletResponse-svar) {respons.addHeader ("Baeldung-eksempel-header", "Værdi-HttpServletResponse"); returner "Svar med header ved hjælp af HttpServletResponse"; }

Som vist i eksemplet behøver vi ikke returnere svarobjektet.

2.2. Ved brug af SvarEnhed

Lad os i dette tilfælde bruge BodyBuilder leveret af SvarEnhed klasse:

@GetMapping ("/ response-entity-builder-with-http-headers") public ResponseEntity usingResponseEntityBuilderAndHttpHeaders () {HttpHeaders responseHeaders = nye HttpHeaders (); responseHeaders.set ("Baeldung-eksempel-header", "Value-ResponseEntityBuilderWithHttpHeaders"); returnere ResponseEntity.ok () .headers (responseHeaders) .body ("Svar med header ved hjælp af ResponseEntity"); }

Det HttpHeaders klasse tilbyder masser af bekvemmelighedsmetoder til at indstille de mest almindelige overskrifter.

Vi kan se flere eksempler, der illustrerer disse punkter i vores Github-repo.

2.3. Tilføjelse af en header til alle svar

Lad os forestille os, at vi vil indstille en bestemt overskrift til mange af vores slutpunkter.

Det ville selvfølgelig være frustrerende, hvis vi skal replikere den tidligere kode på hver kortlægningsmetode.

En bedre tilgang til at opnå dette er ved konfiguration af en Filter i vores tjeneste:

@WebFilter ("/ filter-respons-header / *") offentlig klasse AddResponseHeaderFilter implementerer filter {@ Override public void doFilter (ServletRequest anmodning, ServletResponse respons, FilterChain chain) kaster IOException, ServletException {HttpServletResponse httpServletResponse; httpServletResponse.setHeader ("Baeldung-eksempel-filter-header", "Værdifilter"); chain.doFilter (anmodning, svar); } @Override public void init (FilterConfig filterConfig) kaster ServletException {// ...} @Override public void destroy () {// ...}}

Det @WebFilter kommentar giver os mulighed for at angive urlMønstre for hvilken dette Filter bliver effektiv.

Som vi har påpeget i denne artikel, for at gøre vores Filter kan findes af foråret, skal vi tilføje @ServletComponentScan kommentar til vores Spring Application-klasse:

@ServletComponentScan @ SpringBootApplication offentlig klasse ResponseHeadersApplication {public static void main (String [] args) {SpringApplication.run (ResponseHeadersApplication.class, args); }}

Vi kan undgå dette sidste trin, hvis vi ikke har brug for nogen af ​​de funktioner, der leveres af @WebFilterved hjælp af @Komponent kommentar i vores Filter klasse i stedet.

3. Overskrifter til reaktive slutpunkter

Igen vil vi se, hvordan du indstiller overskrifter på enkelt slutpunktsrespons ved hjælp af ServerHttpResponse, SvarEnhed eller Serverrespons (til funktionelle slutpunkter) klasser og grænseflader.

Vi lærer også, hvordan du implementerer en Spring 5 WebFilter for at tilføje en overskrift på alle vores svar.

3.1. Ved brug af ServerHttpResponse

Denne tilgang svarer temmelig til HttpServletResponse modstykke:

@GetMapping ("/ server-http-respons") offentlig mono ved hjælp af ServerHttpResponse (ServerHttpResponse respons) {respons.getHeaders (). Tilføj ("Baeldung-eksempel-header", "Value-ServerHttpResponse"); returner Mono.just ("Svar med header ved hjælp af ServerHttpResponse"); }

3.2. Ved brug af SvarEnhed

Vi kan bruge SvarEnhed klasse nøjagtigt som vi gør for ikke-reaktive slutpunkter:

@GetMapping ("/ response-entity") offentlig mono usingResponseEntityBuilder () {String responseHeaderKey = "Baeldung-eksempel-header"; String responseHeaderValue = "Value-ResponseEntityBuilder"; String responseBody = "Svar med header ved hjælp af ResponseEntity (builder)"; returner Mono.just (ResponseEntity.ok () .header (responseHeaderKey, responseHeaderValue) .body (responseBody)); }

3.3. Ved brug af Serverrespons

Klasser og grænseflader, der er introduceret i de sidste to underafsnit, kan bruges i @Kontrol bemærkede klasser, men er ikke egnede til det nye Spring 5 Functional Web Framework.

Hvis vi vil at indstille en header på en HandlerFunktion så bliver vi nødt til at få fat i Serverresponsgrænseflade:

offentlig Mono useHandler (endelig anmodning om ServerRequest) {return ServerResponse.ok () .header ("Baeldung-eksempel-header", "Value-Handler"). body (Mono.just ("Response with header using Handler"), String. klasse); }

3.4. Tilføjelse af en header til alle svar

Endelig Forår 5 giver en WebFilter interfacefor at indstille en header på alle svarene hentet af en tjeneste:

@Komponent offentlig klasse AddResponseHeaderWebFilter implementerer WebFilter {@Override offentligt monofilter (ServerWebExchange-udveksling, WebFilterChain-kæde) {exchange.getResponse () .getHeaders () .add ("Baeldung-eksempel-filter-header", "Værdifilter"); return chain.filter (udveksling); }}

4. Konklusion

Afslutningsvis har vi lært mange forskellige måder at indstille en header på et svar, enten hvis vi vil indstille det på et enkelt slutpunkt, eller hvis vi vil konfigurere alle vores rest-API'er, selvom vi migrerer til den reaktive stak , nu har vi viden til at gøre alle disse ting.

Som altid kan alle eksemplerne fås i vores Github-arkiv, både de ikke-reaktive og dem, der bruger Spring 5-specifik funktionalitet.


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