Hoe HTTP-headers te lezen in Spring REST-controllers

1. Inleiding

In deze korte tutorial gaan we kijken hoe je toegang krijgt tot HTTP-headers in een Spring Rest Controller.

Ten eerste gebruiken we de @RequestHeader annotatie om headers zowel afzonderlijk als allemaal samen te lezen.

Daarna gaan we dieper in op de @RequestHeader‘S attributen.

2. Toegang krijgen tot HTTP-headers

2.1. Individueel

Als we toegang nodig hebben tot een specifieke header, we kunnen configureren @RequestHeader met de koptekstnaam:

@GetMapping ("/ greeting") openbare ResponseEntity-begroeting (@RequestHeader ("accept-language") String-taal) {// code die de taalvariabele gebruikt return new ResponseEntity (groet, HttpStatus.OK); }

Vervolgens hebben we toegang tot de waarde met behulp van de variabele die aan onze methode is doorgegeven. Als een koptekst met de naam accepteer-taal niet wordt gevonden in het verzoek, retourneert de methode een "400 Bad Request" -fout.

Onze headers hoeven geen strings te zijn. Als we bijvoorbeeld weten dat onze koptekst een getal is, kunnen we onze variabele declareren als een numeriek type:

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

2.2. Alles in een keer

Als we niet zeker weten welke kopteksten aanwezig zullen zijn, of we hebben er meer nodig dan we willen in de handtekening van onze methode, kunnen we de @RequestHeader annotatie zonder een specifieke naam.

We hebben een paar keuzes voor ons type variabele: a Kaart, een MultiValueMap of een HttpHeaders voorwerp.

Laten we eerst de verzoekheaders als een Kaart:

@GetMapping ("/ listHeaders") openbare ResponseEntity listAllHeaders (@RequestHeader Map headers) {headers.forEach ((key, value) -> {LOG.info (String.format ("Header '% s' =% s", key , waarde)); }); retourneer nieuwe ResponseEntity (String.format ("Vermelde% d headers", headers.size ()), HttpStatus.OK); }

Als we een Kaart en een van de kopteksten heeft meer dan één waarde, we krijgen alleen de eerste waarde. Dit is het equivalent van het gebruik van de getFirst methode op een MultiValueMap.

Als onze kopteksten mogelijk meerdere waarden hebben, kunnen we ze krijgen als een MultiValueMap:

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

We kunnen ook onze headers krijgen als een HttpHeaders voorwerp:

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

De HttpHeaders object heeft accessors voor algemene applicatieheaders.

Wanneer we een koptekst op naam openen vanuit een Kaart, MultiValueMap of de HttpHeaders object, we krijgen een nul als het niet aanwezig is.

3. @RequestHeader Attributen

Nu we de basisprincipes van toegang tot verzoekheaders hebben besproken met de @RequestHeader annotatie, laten we de attributen eens nader bekijken.

We hebben de naam of waarde attributen impliciet wanneer we onze header specifiek hebben genoemd:

openbare ResponseEntity-begroeting (@RequestHeader ("accept-language") String-taal) {}

We kunnen hetzelfde bereiken door de naam attribuut:

openbare ResponseEntity-begroeting (@RequestHeader (name = "accept-language") String-taal) {}

Laten we vervolgens de waarde attribuut op precies dezelfde manier:

openbare ResponseEntity-begroeting (@RequestHeader (value = "accept-language") String-taal) {}

Wanneer we een koptekst specifiek benoemen, is de koptekst standaard vereist. Als de header niet in het verzoek wordt gevonden, retourneert de controller een 400-fout.

Laten we de verplicht attribuut om aan te geven dat onze koptekst niet vereist is:

@GetMapping ("/ nonRequiredHeader") public ResponseEntity evaluNonRequiredHeader (@RequestHeader (value = "optional-header", required = false) String optionalHeader) {return new ResponseEntity (String.format ("Was de optionele header aanwezig?% S!" , (optionalHeader == null? "Nee": "Ja")), HttpStatus.OK); }

Sinds onze variabele zal zijn nul als de header niet aanwezig is in het verzoek, we moeten er zeker van zijn dat we het juiste doen nul controleren.

Laten we de standaardwaarde attribuut om een ​​standaardwaarde voor onze koptekst op te geven:

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

4. Conclusie

In deze korte zelfstudie hebben we geleerd hoe we toegang kunnen krijgen tot aanvraagheaders in Spring REST-controllers. Ten eerste hebben we de @RequestHeader annotatie om verzoekheaders aan onze controllermethoden te leveren.

Na de basis te hebben bekeken, hebben we de attributen voor het @RequestHeader annotatie.

De voorbeeldcode is beschikbaar op GitHub.


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