Рубрики
Без рубрики

Как установить заголовок в ответе с помощью Spring 5

Узнайте, как установить заголовок для конкретного ответа или для всех ответов весной.

Автор оригинала: baeldung.

1. Обзор

В этом кратком руководстве мы рассмотрим различные способы установки заголовка в ответе службы , либо для нереактивных конечных точек , либо для API, использующих Spring 5 WebFlux framework .

Более подробную информацию об этом фреймворке мы можем найти в предыдущих постах .

2. Заголовки для нереактивных компонентов

Если мы хотим установить заголовки для отдельных ответов, мы можем использовать HttpServletResponse или ResponseEntity объекты.

С другой стороны, если наша цель состоит в том, чтобы добавить фильтр ко всем или нескольким ответам, нам нужно будет настроить Фильтр .

2.1. Использование HttpServletResponse

Нам просто нужно добавить объект HttpServletResponse в нашу конечную точку REST в качестве аргумента, а затем использовать метод AddHeader() :

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

Как показано в примере, нам не нужно возвращать объект ответа.

2.2. Использование ResponseEntity

В этом случае давайте использовать Культурист , предоставленный классом ResponseEntity :

@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");
}

То Заголовки Http класс предлагает множество удобных методов для установки наиболее распространенных заголовков.

Мы можем увидеть больше примеров, иллюстрирующих эти моменты, в нашем репо Github .

2.3. Добавление заголовка для всех ответов

Теперь давайте представим, что мы хотим установить определенный заголовок для многих наших конечных точек.

Конечно, было бы неприятно, если бы нам пришлось повторять предыдущий код для каждого метода сопоставления.

Лучший подход для достижения этой цели – настройка Фильтра в нашем сервисе :

@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() {
        // ...
    }
}

То @WebFilter аннотация позволяет нам указать URL-шаблоны для чего это Фильтр станет эффективным.

Как мы уже указывали в этой статье , чтобы сделать наш Фильтр доступным для обнаружения весной, нам нужно добавить аннотацию @ServletComponentScan в наш класс приложений Spring:

@ServletComponentScan
@SpringBootApplication
public class ResponseHeadersApplication {

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

Мы можем избежать этого последнего шага , если нам не нужна какая-либо функциональность, предоставляемая @WebFilter , используя вместо этого аннотацию @Component в нашем классе Filter .

3. Заголовки для реактивных конечных точек

Опять же, мы увидим, как установить заголовки для ответов одной конечной точки с помощью классов и интерфейсов ServerHttpResponse , ResponseEntity или ServerResponse (для функциональных конечных точек).

Мы также узнаем, как реализовать Spring 5 Веб-фильтр , чтобы добавить заголовок ко всем нашим ответам.

3.1. Использование ServerHttpResponse

Этот подход довольно похож на аналог HttpServletResponse :

@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. Использование ResponseEntity

Мы можем использовать класс ResponseEntity точно так же, как и для нереактивных конечных точек:

@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. Использование ответа сервера

Классы и интерфейсы, представленные в последних двух подразделах, могут использоваться в аннотированных классах @Controller , но не подходят для новой функциональной веб-платформы Spring 5 .

Если мы хотим установить заголовок для функции обработчика , то нам нужно будет получить в свои руки ответ сервера | интерфейс:

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. Добавление заголовка для всех ответов

Наконец, Spring 5 предоставляет Веб-фильтр интерфейс для установки заголовка для всех ответов , полученных службой:

@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. Заключение

В заключение, мы узнали много различных способов установки заголовка в ответе, либо если мы хотим установить его на одной конечной точке, либо если мы хотим настроить все наши API rest, даже если мы переходим в реактивный стек, теперь у нас есть знания, чтобы сделать все это.

Как всегда, все примеры могут быть доступны в нашем репозитории Github, как нереактивные , так и те, которые используют специфическую функциональность Spring 5 .