Sådan læses HTTP-headere i REST-controllere om foråret

1. Introduktion

I denne hurtige vejledning skal vi se på, hvordan du får adgang til HTTP-headere i en Spring Rest Controller.

Først bruger vi @RequestHeader kommentar til at læse overskrifter individuelt såvel som alle sammen.

Derefter ser vi et dybere kig på @RequestHeader'S attributter.

2. Adgang til HTTP-headere

2.1. Individuelt

Hvis vi har brug for adgang til en bestemt header, vi kan konfigurere @RequestHeader med headernavnet:

@GetMapping ("/ greeting") offentlig ResponseEntity-hilsen (@RequestHeader ("accept-sprog") String-sprog) {// kode, der bruger sprogvariablen, returnerer ResponseEntity (hilsen, HttpStatus.OK); }

Derefter kan vi få adgang til værdien ved hjælp af variablen, der sendes til vores metode. Hvis et header hedder accept-sprog ikke findes i anmodningen, returnerer metoden en “400 Bad Request” -fejl.

Vores headere behøver ikke at være strenge. For eksempel, hvis vi ved, at vores overskrift er et tal, kan vi erklære vores variabel som en numerisk type:

@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. Alt på en gang

Hvis vi ikke er sikre på, hvilke overskrifter der vil være til stede, eller hvis vi har brug for flere af dem, end vi ønsker i vores metodes underskrift, kan vi bruge @RequestHeader kommentar uden et specifikt navn.

Vi har et par valg til vores variabeltype: a Kort, a MultiValueMap eller a HttpHeaders objekt.

Lad os først få anmodningsoverskrifterne som en Kort:

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

Hvis vi bruger en Kort og en af ​​overskrifterne har mere end en værdi, får vi kun den første værdi. Dette svarer til at bruge getFirst metode på en MultiValueMap.

Hvis vores overskrifter kan have flere værdier, kan vi få dem som en 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 ("); returner ny ResponseEntity (String.format (" Listed% d headers ", headers.size ()), HttpStatus.OK);}

Vi kan også få vores overskrifter som en HttpHeaders objekt:

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

Det HttpHeaders objekt har accessorer til almindelige applikationsoverskrifter.

Når vi får adgang til en header ved navn fra en Kort, MultiValueMap eller den HttpHeaders objekt, vi får en nul hvis det ikke er til stede.

3. @RequestHeader Egenskaber

Nu hvor vi har gennemgået det grundlæggende ved at få adgang til anmodningsoverskrifter med @RequestHeader kommentar, lad os se nærmere på dens egenskaber.

Vi har allerede brugt navn eller værdi attributter implicit, når vi specifikt har navngivet vores header:

offentlig ResponseEntity-hilsen (@RequestHeader ("accept-sprog") String-sprog) {}

Vi kan opnå det samme ved at bruge navn attribut:

offentlig ResponseEntity-hilsen (@RequestHeader (name = "accept-sprog") String-sprog) {}

Lad os derefter bruge værdi attribut nøjagtigt på samme måde:

offentlig ResponseEntity-hilsen (@RequestHeader (værdi = "accept-sprog") Sprog til streng) {}

Når vi navngiver en header specifikt, er headeren påkrævet som standard. Hvis overskriften ikke findes i anmodningen, returnerer controlleren en 400-fejl.

Lad os bruge krævet attribut for at angive, at vores header ikke er påkrævet:

@GetMapping ("/ nonRequiredHeader") public ResponseEntity evaluNonRequiredHeader (@RequestHeader (value = "optional-header", required = false) String optionalHeader) {returner ny ResponseEntity (String.format ("Var den valgfri header til stede?% S!" , (optionalHeader == null? "Nej": "Ja")), HttpStatus.OK); }

Siden vores variabel vil være nul hvis overskriften ikke er til stede i anmodningen, skal vi være sikre på at gøre det rette nul kontrol.

Lad os bruge standard værdi attribut for at give en standardværdi for vores overskrift:

@GetMapping ("/ standard") offentlig ResponseEntity evaluereDefaultHeaderValue (@RequestHeader (værdi = "valgfri header", defaultValue = "3600") int optionalHeader) {returner ny ResponseEntity (String.format ("Valgfri header er% d", optionalHeader ), HttpStatus.OK); }

4. Konklusion

I denne korte vejledning lærte vi, hvordan du får adgang til anmodningsoverskrifter i Spring REST-controllere. Først brugte vi @RequestHeader kommentar til at levere anmodningsoverskrifter til vores controller-metoder.

Efter et kig på det grundlæggende tog vi et detaljeret kig på attributterne til @RequestHeader kommentar.

Eksempelkoden er tilgængelig på GitHub.