Een koptekst instellen voor een reactie met Spring 5

1. Overzicht

In deze korte tutorial, we zullen verschillende manieren doornemen om een ​​koptekst op een servicerespons in te stellen, hetzij voor niet-reactieve eindpunten of voor API's die het 5 WebFlux-framework van Spring gebruiken.

We kunnen meer informatie over dit kader vinden in eerdere berichten.

2. Headers voor niet-reactieve componenten

Als we kopteksten willen instellen op enkele antwoorden die we kunnen gebruiken HttpServletResponse of ResponseEntity voorwerpen.

Aan de andere kant, als het ons doel is om een ​​filter toe te voegen aan alle of meerdere reacties, moeten we een Filter.

2.1. Gebruik makend van HttpServletResponse

We moeten gewoon de HttpServletResponse object naar ons REST-eindpunt als een argument en gebruik vervolgens de addHeader () methode:

@GetMapping ("/ http-servlet-response") openbare String usingHttpServletResponse (HttpServletResponse response) {response.addHeader ("Baeldung-Example-Header", "Value-HttpServletResponse"); retourneer "Reactie met koptekst met behulp van HttpServletResponse"; }

Zoals in het voorbeeld wordt getoond, hoeven we het responsobject niet te retourneren.

2.2. Gebruik makend van ResponseEntity

Laten we in dit geval de BodyBuilder verstrekt door de ResponseEntity klasse:

@GetMapping ("/ response-entity-builder-with-http-headers") openbare ResponseEntity usingResponseEntityBuilderAndHttpHeaders () {HttpHeaders responseHeaders = nieuwe HttpHeaders (); responseHeaders.set ("Baeldung-Example-Header", "Value-ResponseEntityBuilderWithHttpHeaders"); return ResponseEntity.ok () .headers (responseHeaders) .body ("Reactie met header met ResponseEntity"); }

De HttpHeaders class biedt tal van handige methoden om de meest voorkomende headers in te stellen.

We kunnen meer voorbeelden zien die deze punten illustreren in onze Github-repo.

2.3. Een koptekst toevoegen voor alle reacties

Laten we ons nu eens voorstellen dat we een bepaalde koptekst willen instellen op veel van onze eindpunten.

Het zou natuurlijk frustrerend zijn als we de vorige code op elke toewijzingsmethode moeten repliceren.

Een betere benadering om dit te bereiken is door configureren van een Filter in onze dienst:

@WebFilter ("/ filter-response-header / *") public class AddResponseHeaderFilter implementeert Filter {@Override public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain) gooit IOException, ServletException {HttpServletResponse httpServletResponse response = (HttpServletResponse = (HttpServletResponse) response =; httpServletResponse.setHeader ("Baeldung-Example-Filter-Header", "Value-Filter"); chain.doFilter (verzoek, antwoord); } @Override public void init (FilterConfig filterConfig) gooit ServletException {// ...} @Override public void destroy () {// ...}}

De @WebFilter annotatie stelt ons in staat om de urlPatterns waarvoor dit Filter zal effectief worden.

Zoals we in dit artikel hebben opgemerkt, om onze Filter detecteerbaar door Spring, moeten we de @BuienRadarNL annotatie bij onze Spring Application-klasse:

@ServletComponentScan @SpringBootApplication openbare klasse ResponseHeadersApplication {openbare statische leegte hoofd (String [] args) {SpringApplication.run (ResponseHeadersApplication.class, args); }}

We kunnen deze laatste stap vermijden als we de functionaliteit van @WebFilter, door de @Component annotatie in onze Filter klasse in plaats daarvan.

3. Headers voor reactieve eindpunten

Nogmaals, we zullen zien hoe headers kunnen worden ingesteld op reacties op één eindpunt met behulp van ServerHttpResponse, ResponseEntity of ServerResponse (voor functionele eindpunten) klassen en interfaces.

We zullen ook leren hoe u een Spring 5 implementeert WebFilter om een ​​koptekst toe te voegen aan al onze reacties.

3.1. Gebruik makend van ServerHttpResponse

Deze benadering lijkt redelijk op de HttpServletResponse tegenhanger:

@GetMapping ("/ server-http-response") openbare Mono usingServerHttpResponse (ServerHttpResponse response) {response.getHeaders (). Add ("Baeldung-Example-Header", "Value-ServerHttpResponse"); return Mono.just ("Reactie met koptekst met ServerHttpResponse"); }

3.2. Gebruik makend van ResponseEntity

We kunnen de ResponseEntity klasse precies zoals we doen voor niet-reactieve eindpunten:

@GetMapping ("/ response-entity") openbare Mono usingResponseEntityBuilder () {String responseHeaderKey = "Baeldung-Voorbeeld-Header"; String responseHeaderValue = "Waarde-ResponseEntityBuilder"; String responseBody = "Reactie met header met behulp van ResponseEntity (builder)"; retourneer Mono.just (ResponseEntity.ok () .header (responseHeaderKey, responseHeaderValue) .body (responseBody)); }

3.3. Gebruik makend van ServerResponse

De klassen en interfaces die in de laatste twee subsecties zijn geïntroduceerd, kunnen worden gebruikt in @Controller geannoteerde klassen, maar zijn niet geschikt voor het nieuwe Spring 5 Functional Web Framework.

Als we willen om een ​​koptekst in te stellen op een HandlerFunctie dan moeten we de ServerResponsekoppel:

public Mono useHandler (laatste ServerRequest-verzoek) {return ServerResponse.ok () .header ("Baeldung-Example-Header", "Value-Handler") .body (Mono.just ("Response met header met behulp van handler"), String. klasse); }

3.4. Een koptekst toevoegen voor alle reacties

Ten slotte, Spring 5 biedt een WebFilter koppelom een ​​koptekst in te stellen op alle antwoorden opgehaald door een dienst:

@Component public class AddResponseHeaderWebFilter implementeert WebFilter {@Override public Mono filter (ServerWebExchange exchange, WebFilterChain chain) {exchange.getResponse () .getHeaders () .add ("Baeldung-Example-Filter-Header", "Value-Filter"); return chain.filter (uitwisseling); }}

4. Conclusie

Concluderend hebben we veel verschillende manieren geleerd om een ​​koptekst op een antwoord in te stellen, hetzij als we het op een enkel eindpunt willen instellen of als we al onze overige API's willen configureren, zelfs als we migreren naar de reactieve stack , nu hebben we de kennis om al deze dingen te doen.

Zoals altijd zijn alle voorbeelden toegankelijk in onze Github-repository, zowel de niet-reactieve als degenen die Spring 5-specifieke functionaliteit gebruiken.