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

Festlegen eines Headers für eine Antwort mit Spring 5

1. Überblick

In diesem kurzen Tutorialwe’ll go through different ways of setting a header on a service response, entweder für nicht reaktive Endpunkte oder für APIs, dieSpring’s 5 WebFlux framework verwenden.

Weitere Informationen zu diesem Framework finden Sie inprevious posts.

2. Header für nicht reaktive Komponenten

Wenn wir Header für einzelne Antworten setzen möchten, können wirHttpServletResponse- oderResponseEntity-Objekte verwenden.

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

2.1. Verwenden vonHttpServletResponse

Wir müssen einfach dasHttpServletResponse-Objekt als Argument zu unserem REST-Endpunkt hinzufügen und dann dieaddHeader()-Methode verwenden:

@GetMapping("/http-servlet-response")
public String usingHttpServletResponse(HttpServletResponse response) {
    response.addHeader("example-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 vonResponseEntity

In diesem Fall verwenden wir dieBodyBuilder, die von derResponseEntity-Klasse bereitgestellt werden:

@GetMapping("/response-entity-builder-with-http-headers")
public ResponseEntity usingResponseEntityBuilderAndHttpHeaders() {
    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.set("example-Example-Header",
      "Value-ResponseEntityBuilderWithHttpHeaders");

    return ResponseEntity.ok()
      .headers(responseHeaders)
      .body("Response with header using ResponseEntity");
}

Die KlasseHttpHeadersbietet zahlreiche praktische Methoden zum Festlegen der häufigsten Überschriften.

Wir können weitere Beispiele sehen, die diese Punkte inour Github repo veranschaulichen.

2.3. Hinzufügen eines Headers 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, istconfiguring a Filter in our 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(
          "example-Example-Filter-Header", "Value-Filter");
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // ...
    }

    @Override
    public void destroy() {
        // ...
    }
}

Die Annotation@WebFilter ermöglicht es uns, dieurlPatterns  anzugeben, für die dieseFilter -Schwellung wirksam wird.

Wie wir bereits aufin this article hingewiesen haben, müssen wir unserer Spring Application-Klasse die@ServletComponentScan -Sannotation hinzufügen, damit unsereFilter bis zum Frühjahr erkennbar sind:

@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 keine der von@WebFilter bereitgestellten Funktionen benötigen, indem wir stattdessen die Annotation@Component in unserer KlasseFilter verwenden.

3. Header für reaktive Endpunkte

Wir werden erneut sehen, wie Header für einzelne Endpunktantworten mithilfe der Klassen und SchnittstellenServerHttpResponse,ResponseEntity oderServerResponse (für funktionale Endpunkte) festgelegt werden.

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

3.1. Verwenden vonServerHttpResponse

Dieser Ansatz ist dem Gegenstück vonHttpServletResponseziemlich ähnlich:

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

3.2. Verwenden vonResponseEntity

Wir können die KlasseResponseEntitygenau wie für nicht reaktive Endpunkte verwenden:

@GetMapping("/response-entity")
public Mono> usingResponseEntityBuilder() {
    String responseHeaderKey = "example-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 vonServerResponse

Die in den letzten beiden Unterabschnitten eingeführten Klassen und Schnittstellen können in sannotierten@Controller -Klassen verwendet werden, sind jedoch nicht für die neuenSpring 5 Functional Web Framework geeignet.

Wenn wir die Schnittstelle vonto set a header on a HandlerFunction then we’ll need to get our hands on the ServerResponsewollen:

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

3.4. Hinzufügen eines Headers für alle Antworten

Zuletzt werdenSpring 5 provides a WebFilter interface to set a header on all the responsesvon einem Dienst abgerufen:

@Component
public class AddResponseHeaderWebFilter implements WebFilter {

    @Override
    public Mono filter(ServerWebExchange exchange, WebFilterChain chain) {
        exchange.getResponse()
          .getHeaders()
          .add("example-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 aufnon-reactive onesals auch auf diejenigen, dieSpring 5 specific functionalityverwenden.