So setzen Sie mit Spring 5 einen Header für eine Antwort

1. Übersicht

In diesem kurzen Tutorial werden verschiedene Möglichkeiten zum Festlegen eines Headers für eine Serviceantwort beschrieben , entweder für nicht reaktive Endpunkte oder für APIs, die das Spring 5 WebFlux-Framework verwenden.

Weitere Informationen zu diesem Framework finden Sie in früheren Beiträgen.

2. Header für nicht reaktive Komponenten

Wenn wir Header für einzelne Antworten festlegen möchten, können wir HttpServletResponse- oder ResponseEntity- Objekte verwenden.

Wenn unser Ziel jedoch darin besteht, allen oder mehreren Antworten einen Filter hinzuzufügen, müssen wir einen Filter konfigurieren .

2.1. Verwenden von HttpServletResponse

Wir müssen lediglich das HttpServletResponse- Objekt als Argument zu unserem REST-Endpunkt hinzufügen und dann die addHeader () -Methode verwenden:

@GetMapping("/http-servlet-response") public String usingHttpServletResponse(HttpServletResponse response) { response.addHeader("Baeldung-Example-Header", "Value-HttpServletResponse"); return "Response with header using HttpServletResponse"; }

Wie im Beispiel gezeigt, müssen wir das Antwortobjekt nicht zurückgeben.

2.2. Verwenden von ResponseEntity

In diesem Fall verwenden wir den BodyBuilder, der von der ResponseEntity- Klasse bereitgestellt wird :

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

Die HttpHeaders- Klasse bietet zahlreiche praktische Methoden zum Festlegen der häufigsten Header.

Weitere Beispiele, die diese Punkte veranschaulichen, finden Sie in unserem Github-Repo.

2.3. Hinzufügen einer Kopfzeile für alle Antworten

Stellen wir uns nun vor, wir möchten einen bestimmten Header für viele unserer Endpunkte festlegen.

Natürlich wäre es frustrierend, wenn wir den vorherigen Code für jede Zuordnungsmethode replizieren müssten.

Ein besserer Ansatz, um dies zu erreichen, ist die Konfiguration eines Filters in unserem Service :

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

Mit der Annotation @WebFilter können wir die urlPatterns angeben, für die dieser Filter wirksam wird.

Wie in diesem Artikel erwähnt, müssen wir unserer Spring Application-Klasse die Annotation @ServletComponentScan hinzufügen , damit unser Filter bis zum Frühjahr erkennbar ist :

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

Wir können diesen letzten Schritt vermeiden , wenn wir eine der Funktionalität müssen nicht von einem dritten @WebFilter , durch die Verwendung von @Component Annotation in unserer Filterklasse statt.

3. Header für reaktive Endpunkte

Wieder werden wir sehen, wie Header für einzelne Endpunktantworten mithilfe von ServerHttpResponse- , ResponseEntity- oder ServerResponse- Klassen und -Schnittstellen (für funktionale Endpunkte) festgelegt werden.

Wir werden auch lernen, wie Sie einen Spring 5- WebFilter implementieren , um allen unseren Antworten einen Header hinzuzufügen.

3.1. Verwenden von ServerHttpResponse

Dieser Ansatz ist dem HttpServletResponse- Gegenstück ziemlich ähnlich :

@GetMapping("/server-http-response") public Mono usingServerHttpResponse(ServerHttpResponse response) { response.getHeaders().add("Baeldung-Example-Header", "Value-ServerHttpResponse"); return Mono.just("Response with header using ServerHttpResponse"); }

3.2. Verwenden von ResponseEntity

Wir können die ResponseEntity- Klasse genauso verwenden wie für nicht reaktive Endpunkte:

@GetMapping("/response-entity") public Mono
    
      usingResponseEntityBuilder() { String responseHeaderKey = "Baeldung-Example-Header"; String responseHeaderValue = "Value-ResponseEntityBuilder"; String responseBody = "Response with header using ResponseEntity (builder)"; return Mono.just(ResponseEntity.ok() .header(responseHeaderKey, responseHeaderValue) .body(responseBody)); }
    

3.3. Verwenden von ServerResponse

Die in den letzten beiden Unterabschnitten eingeführten Klassen und Schnittstellen können in mit @ Controller kontrollierten Anmerkungen verwendet werden, sind jedoch nicht für das neue Spring 5 Functional Web Framework geeignet.

Wenn wir einen Header für eine HandlerFunction setzen möchten , müssen wir die ServerResponse- Schnittstelle in die Hände bekommen :

public Mono useHandler(final ServerRequest request) { return ServerResponse.ok() .header("Baeldung-Example-Header", "Value-Handler") .body(Mono.just("Response with header using Handler"),String.class); }

3.4. Hinzufügen einer Kopfzeile für alle Antworten

Schließlich bietet Spring 5 eine WebFilter- OberflächeSo setzen Sie einen Header für alle Antworten, die von einem Dienst abgerufen werden:

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

4. Fazit

Zusammenfassend haben wir viele verschiedene Möglichkeiten zum Festlegen eines Headers für eine Antwort kennengelernt, entweder wenn wir ihn auf einem einzelnen Endpunkt festlegen möchten oder wenn wir alle unsere Rest-APIs konfigurieren möchten, selbst wenn wir auf den reaktiven Stapel migrieren Jetzt haben wir das Wissen, all diese Dinge zu tun.

Wie immer kann auf alle Beispiele in unserem Github-Repository zugegriffen werden, sowohl auf die nicht reaktiven als auch auf die mit Spring 5-spezifischen Funktionen.