Cara Membaca Header HTTP di Pengontrol REST Musim Semi

1. Perkenalan

Dalam tutorial singkat ini, kita akan melihat bagaimana mengakses HTTP Headers di Spring Rest Controller.

Pertama, kita akan menggunakan anotasi @RequestHeader untuk membaca header satu per satu dan sekaligus.

Setelah itu, kita akan melihat lebih dalam pada atribut @RequestHeader .

2. Mengakses Header HTTP

2.1. Secara individual

Jika kita membutuhkan akses ke header tertentu, kita dapat mengkonfigurasi @RequestHeader dengan nama header:

@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 variabel yang dilewatkan ke dalam metode kita. Jika header bernama accept-language tidak ditemukan dalam permintaan, metode akan mengembalikan kesalahan "400 Bad Request".

Header kami tidak harus berupa string. Misalnya, jika kita tahu header kita adalah angka, kita bisa mendeklarasikan variabel kita sebagai tipe numerik:

@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. Semua sekaligus

Jika kita tidak yakin header mana yang akan ditampilkan, atau kita membutuhkan lebih banyak dari yang kita inginkan dalam tanda tangan metode kita, kita dapat menggunakan anotasi @RequestHeader tanpa nama tertentu.

Kami memiliki beberapa pilihan untuk tipe variabel kami: Peta , MultiValueMap atau objek HttpHeaders .

Pertama, mari kita dapatkan header 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); }

Jika kita menggunakan Peta dan salah satu tajuk memiliki lebih dari satu nilai , kita hanya akan mendapatkan nilai pertama . Ini sama dengan menggunakan metode getFirst pada MultiValueMap .

Jika header kita mungkin memiliki beberapa nilai, kita bisa mendapatkannya sebagai MultiValueMap :

@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 bisa mendapatkan header kita 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 memiliki accesor untuk header aplikasi umum.

Saat kita mengakses header dengan nama dari objek Map , MultiValueMap , atau HttpHeaders , kita akan mendapatkan null jika tidak ada.

3. Atribut @RequestHeader

Sekarang setelah kita membahas dasar-dasar mengakses header permintaan dengan anotasi @RequestHeader , mari kita lihat lebih dekat atributnya.

Kami telah menggunakan atribut nama atau nilai secara implisit ketika kami secara khusus menamai header kami:

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

Kita dapat mencapai hal yang sama dengan menggunakan atribut name :

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

Selanjutnya, mari gunakan atribut value dengan cara yang persis sama:

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

Saat kami memberi nama header secara khusus, header diperlukan secara default. Jika header tidak ditemukan dalam permintaan, controller mengembalikan kesalahan 400.

Mari gunakan atribut yang diperlukan untuk menunjukkan bahwa tajuk kita 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); }

Karena variabel kita akan menjadi null jika header tidak ada dalam permintaan , kita perlu memastikan untuk melakukan pemeriksaan null yang sesuai .

Mari gunakan atribut defaultValue untuk memberikan nilai default untuk header kita:

@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 singkat ini, kita mempelajari cara mengakses header permintaan di pengontrol Spring REST. Pertama, kami menggunakan anotasi @RequestHeader untuk memberikan header permintaan ke metode pengontrol kami.

Setelah melihat dasar-dasarnya, kami melihat secara mendetail atribut untuk anotasi @RequestHeader .

Kode contoh tersedia di GitHub.