Cara Menetapkan Header pada Respons dengan Spring 5

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kita akan melalui cara yang berbeza untuk menetapkan tajuk pada respons perkhidmatan , baik untuk titik akhir yang tidak reaktif atau untuk API yang menggunakan rangka kerja WebFlux Spring 5

Kami boleh mendapatkan maklumat lebih lanjut mengenai rangka kerja ini dalam catatan sebelumnya.

2. Tajuk untuk Komponen Tidak Reaktif

Sekiranya kita mahu menetapkan tajuk pada respons tunggal kita boleh menggunakan objek HttpServletResponse atau ResponseEntity .

Sebaliknya, jika objektif kami adalah untuk menambahkan penapis ke semua atau beberapa tindak balas, kami perlu mengkonfigurasi Penapis .

2.1. Menggunakan HttpServletResponse

Kita hanya perlu menambahkan objek HttpServletResponse ke titik akhir REST kami sebagai argumen, kemudian gunakan kaedah addHeader () :

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

Seperti yang ditunjukkan dalam contoh, kita tidak perlu mengembalikan objek respons.

2.2. Menggunakan ResponseEntity

Dalam kes ini, mari gunakan BodyBuilder yang disediakan oleh kelas 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"); }

The HttpHeaders tawaran kelas banyak kaedah mudah untuk menetapkan tajuk yang paling biasa.

Kita dapat melihat lebih banyak contoh yang menggambarkan perkara-perkara ini di repo Github kami.

2.3. Menambah Tajuk untuk Semua Respons

Sekarang mari kita bayangkan kita mahu menetapkan tajuk tertentu ke banyak titik akhir kita.

Sudah tentu, akan mengecewakan jika kita harus meniru kod sebelumnya pada setiap kaedah pemetaan.

Pendekatan yang lebih baik untuk mencapainya adalah dengan mengkonfigurasi Penapis dalam perkhidmatan kami :

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

The @WebFilter anotasi membolehkan kita untuk menunjukkan urlPatterns yang mana ini Pilih akan berkuat kuasa.

Seperti yang telah kami nyatakan dalam artikel ini, untuk menjadikan Penapis kami dapat ditemui oleh Spring, kami perlu menambahkan anotasi @ServletComponentScan ke kelas Aplikasi Spring kami:

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

Kita boleh mengelakkan langkah terakhir ini jika kita tidak memerlukan fungsi yang disediakan oleh @WebFilter , dengan menggunakan anotasi @Component di kelas Filter kami .

3. Tajuk untuk Titik Akhir Reaktif

Sekali lagi, kita akan melihat cara menetapkan tajuk pada respons titik akhir tunggal menggunakan kelas dan antara muka ServerHttpResponse , ResponseEntity atau ServerResponse (untuk titik akhir fungsional).

Kami juga akan belajar bagaimana menerapkan Spring 5 WebFilter untuk menambahkan tajuk pada semua respons kami.

3.1. Menggunakan ServerHttpResponse

Pendekatan ini agak serupa dengan rakan sejawat 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. Menggunakan ResponseEntity

Kita boleh menggunakan kelas ResponseEntity sama seperti yang kita lakukan untuk titik akhir yang tidak reaktif:

@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. Menggunakan ServerResponse

Kelas dan antara muka yang diperkenalkan dalam dua sub-bahagian terakhir boleh digunakan dalam kelas anotasi @Controller tetapi tidak sesuai untuk Kerangka Web Fungsian Spring 5 yang baru.

Sekiranya kita mahu menetapkan header pada HandlerFunction maka kita perlu menggunakan antara muka ServerResponse :

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. Menambah Tajuk untuk Semua Respons

Terakhir, Spring 5 menyediakan antara muka WebFilteruntuk menetapkan tajuk pada semua respons yang diambil oleh perkhidmatan:

@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. Kesimpulan

Sebagai kesimpulan, kami telah mempelajari banyak cara untuk menetapkan tajuk pada respons, sama ada jika kami ingin menetapkannya pada satu titik akhir atau jika kami ingin mengkonfigurasi semua API rehat kami, walaupun kami berpindah ke timbunan reaktif , sekarang kita mempunyai pengetahuan untuk melakukan semua perkara ini.

Seperti biasa, semua contoh boleh diakses di repositori Github kami, baik yang tidak reaktif dan yang menggunakan fungsi khas Spring 5.