Cara Membaca Header HTTP di Spring REST Controllers

1. Pengenalan

Dalam tutorial ringkas ini, kita akan melihat cara mengakses Header HTTP di Spring Rest Controller.

Pertama, kami akan menggunakan anotasi @RequestHeader untuk membaca tajuk secara individu dan juga bersama-sama.

Selepas itu, kita akan melihat lebih mendalam mengenai atribut @RequestHeader .

2. Mengakses HTTP Header

2.1. Secara individu

Sekiranya kita memerlukan akses ke tajuk tertentu, kita dapat mengkonfigurasi @RequestHeader dengan nama tajuk:

@GetMapping("/greeting") public ResponseEntity greeting(@RequestHeader("accept-language") String language) { // code that uses the language variable return new ResponseEntity(greeting, HttpStatus.OK); }

Kemudian, kita dapat mengakses nilai menggunakan pemboleh ubah yang dimasukkan ke dalam kaedah kita. Sekiranya header bernama accept-language tidak dijumpai dalam permintaan, kaedah mengembalikan ralat "400 Bad Request".

Tajuk kami tidak harus berurutan. Sebagai contoh, jika kita mengetahui tajuk kita adalah nombor, kita boleh menyatakan pemboleh ubah kita sebagai jenis angka:

@GetMapping("/double") public ResponseEntity doubleNumber(@RequestHeader("my-number") int myNumber) { return new ResponseEntity(String.format("%d * 2 = %d", myNumber, (myNumber * 2)), HttpStatus.OK); }

2.2. Sekaligus

Sekiranya kami tidak pasti tajuk mana yang akan hadir, atau kami memerlukan lebih banyak daripada yang kami mahukan dalam tandatangan kaedah kami, kami boleh menggunakan anotasi @RequestHeader tanpa nama tertentu.

Kami mempunyai beberapa pilihan untuk jenis pemboleh ubah kami: Peta , objek MultiValueMap atau HttpHeaders .

Pertama, mari dapatkan tajuk permintaan sebagai Peta :

@GetMapping("/listHeaders") public ResponseEntity listAllHeaders( @RequestHeader Map headers) { headers.forEach((key, value) -> { LOG.info(String.format("Header '%s' = %s", key, value)); }); return new ResponseEntity( String.format("Listed %d headers", headers.size()), HttpStatus.OK); }

Sekiranya kita menggunakan Peta dan salah satu tajuk mempunyai lebih dari satu nilai , kita hanya akan mendapat nilai pertama . Ini setara dengan menggunakan kaedah getFirst pada MultiValueMap .

Sekiranya tajuk kami mempunyai pelbagai nilai, kita dapat menjadikannya sebagai Peta MultiValue :

@GetMapping("/multiValue") public ResponseEntity multiValue( @RequestHeader MultiValueMap headers) { headers.forEach((key, value) ->  LOG.info(String.format( "Header '%s' = %s", key, value.stream().collect(Collectors.joining("); return new ResponseEntity( String.format("Listed %d headers", headers.size()), HttpStatus.OK); }

Kita juga boleh mendapatkan tajuk sebagai objek HttpHeaders :

@GetMapping("/getBaseUrl") public ResponseEntity getBaseUrl(@RequestHeader HttpHeaders headers) { InetSocketAddress host = headers.getHost(); String url = "//" + host.getHostName() + ":" + host.getPort(); return new ResponseEntity(String.format("Base URL = %s", url), HttpStatus.OK); }

The HttpHeaders objek mempunyai Pengakses untuk tajuk permohonan biasa.

Apabila kita mengakses tajuk dengan nama dari objek Peta , MultiValueMap atau HttpHeaders , kita akan mendapat nol jika tidak ada.

3. Atribut @RequestHeader

Sekarang setelah kita membahas asas mengakses tajuk permintaan dengan anotasi @RequestHeader , mari kita perhatikan lebih dekat atributnya.

Kami telah menggunakan nama atau atribut nilai secara tersirat ketika kami secara khusus menamakan tajuk kami:

public ResponseEntity greeting(@RequestHeader("accept-language") String language) {}

Kita boleh mencapai perkara yang sama dengan menggunakan atribut name :

public ResponseEntity greeting( @RequestHeader(name = "accept-language") String language) {}

Seterusnya, mari kita menggunakan nilai atribut dengan cara yang sama:

public ResponseEntity greeting( @RequestHeader(value = "accept-language") String language) {}

Apabila kami menamakan tajuk secara khusus, tajuk diperlukan secara lalai. Sekiranya tajuk tidak dijumpai dalam permintaan, pengawal mengembalikan ralat 400.

Mari gunakan atribut yang diperlukan untuk menunjukkan bahawa tajuk kami tidak diperlukan:

@GetMapping("/nonRequiredHeader") public ResponseEntity evaluateNonRequiredHeader( @RequestHeader(value = "optional-header", required = false) String optionalHeader) { return new ResponseEntity(String.format( "Was the optional header present? %s!", (optionalHeader == null ? "No" : "Yes")),HttpStatus.OK); }

Oleh kerana pemboleh ubah kami akan menjadi nol jika header tidak ada dalam permintaan , kami harus memastikan melakukan pemeriksaan nol yang sesuai .

Mari gunakan atribut defaultValue untuk memberikan nilai lalai untuk tajuk kami:

@GetMapping("/default") public ResponseEntity evaluateDefaultHeaderValue( @RequestHeader(value = "optional-header", defaultValue = "3600") int optionalHeader) { return new ResponseEntity( String.format("Optional Header is %d", optionalHeader), HttpStatus.OK); }

4. Kesimpulan

Dalam tutorial ringkas ini, kami belajar bagaimana mengakses tajuk permintaan di pengawal Spring REST. Pertama, kami menggunakan anotasi @RequestHeader untuk menyediakan tajuk permintaan kepada kaedah pengawal kami.

Setelah melihat asasnya, kami melihat secara terperinci atribut untuk anotasi @RequestHeader .

Kod contoh boleh didapati di GitHub.