Hvordan lese HTTP-overskrifter i REST-kontrollere om våren

1. Introduksjon

I denne raske opplæringen skal vi se på hvordan du får tilgang til HTTP-hoder i en Spring Rest Controller.

Først skal vi bruke @RequestHeader kommentar for å lese overskrifter individuelt så vel som alle sammen.

Etter det vil vi se nærmere på @RequestHeader’S attributter.

2. Få tilgang til HTTP-overskrifter

2.1. Individuelt

Hvis vi trenger tilgang til en bestemt topptekst, vi kan konfigurere @RequestHeader med overskriftsnavnet:

@GetMapping ("/ greeting") offentlig ResponseEntity-hilsen (@RequestHeader ("accept-language") Strengsspråk) {// kode som bruker språkvariabelen returnerer ResponseEntity (hilsen, HttpStatus.OK); }

Deretter kan vi få tilgang til verdien ved hjelp av variabelen som sendes inn i metoden vår. Hvis en overskrift heter godta-språk ikke finnes i forespørselen, returnerer metoden en “400 Bad Request” -feil.

Overskriftene våre trenger ikke være strenger. Hvis vi for eksempel vet at overskriften vår er et tall, kan vi erklære variabelen vår 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 som vil være til stede, eller hvis vi trenger flere av dem enn vi ønsker i metodens signatur, kan vi bruke @RequestHeader kommentar uten et spesifikt navn.

Vi har noen få valg for vår variabeltype: a Kart, a MultiValueMap eller a HttpHeaders gjenstand.

La oss først få forespørselsoverskriftene som en Kart:

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

Hvis vi bruker en Kart og en av topptekstene har mer enn én verdi, får vi bare den første verdien. Dette tilsvarer bruk av getFirst metode på en MultiValueMap.

Hvis overskriftene våre kan ha flere verdier, 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 nye ResponseEntity (String.format (" Listed% d headers ", headers.size ()), HttpStatus.OK);}

Vi kan også få overskriftene våre som en HttpHeaders gjenstand:

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

De HttpHeaders objektet har tilgang for vanlige applikasjonsoverskrifter.

Når vi får tilgang til en overskrift ved navn fra en Kart, MultiValueMap eller HttpHeaders objekt, vi får en null hvis den ikke er til stede.

3. @RequestHeader Attributter

Nå som vi har gått gjennom det grunnleggende om å få tilgang til forespørselsoverskrifter med @RequestHeader kommentar, la oss se nærmere på egenskapene.

Vi har allerede brukt Navn eller verdi attributter implisitt når vi spesifikt har navngitt overskriften vår:

offentlig ResponseEntity-hilsen (@RequestHeader ("aksept-språk") String språk) {}

Vi kan oppnå det samme ved å bruke Navn Egenskap:

offentlig ResponseEntity-hilsen (@RequestHeader (name = "accept-language") Strengsspråk) {}

La oss deretter bruke verdi attributt på samme måte:

offentlig ResponseEntity-hilsen (@RequestHeader (value = "accept-language") String språk) {}

Når vi navngir en overskrift spesifikt, kreves overskriften som standard. Hvis overskriften ikke er funnet i forespørselen, returnerer kontrolleren en 400-feil.

La oss bruke kreves attributt for å indikere at overskriften vår ikke er nødvendig:

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

Siden vår variabel vil være null hvis overskriften ikke er til stede i forespørselen, må vi være sikre på å gjøre det riktige null sjekker.

La oss bruke standardverdi attributt for å gi en standardverdi for overskriften vår:

@GetMapping ("/ default") public ResponseEntity evaluereDefaultHeaderValue (@RequestHeader (value = "optional-header", defaultValue = "3600") int optionalHeader) {returner nye ResponseEntity (String.format ("Valgfri header er% d", optionalHeader ), HttpStatus.OK); }

4. Konklusjon

I denne korte opplæringen lærte vi hvordan du får tilgang til forespørselsoverskrifter i Spring REST-kontrollere. Først brukte vi @RequestHeader kommentar for å levere forespørselsoverskrifter til våre kontrollermetoder.

Etter en titt på det grunnleggende, tok vi en detaljert titt på attributtene for @RequestHeader kommentar.

Eksempelkoden er tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found