Hur man läser HTTP-rubriker på vårens REST-kontroller

1. Introduktion

I den här snabbhandledningen ska vi titta på hur du får åtkomst till HTTP-rubriker i en Spring Rest Controller.

Först använder vi @RequestHeader- anteckningen för att läsa rubriker individuellt såväl som alla tillsammans.

Därefter tar vi en djupare titt på @RequestHeader attribut.

2. Åtkomst till HTTP-rubriker

2.1. Individuellt

Om vi ​​behöver åtkomst till en specifik rubrik kan vi konfigurera @RequestHeader med rubriknamnet :

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

Sedan kan vi komma åt värdet med variabeln som skickas till vår metod. Om en rubrik med namnet acceptans-språk inte finns i begäran returnerar metoden ett felmeddelande "400 dålig begäran".

Våra rubriker behöver inte vara strängar. Om vi ​​till exempel vet att vår rubrik är ett tal kan vi deklarera vår variabel som en numerisk typ:

@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. Allt på en gång

Om vi ​​inte är säkra på vilka rubriker som kommer att finnas, eller om vi behöver mer av dem än vi vill ha i metodens signatur, kan vi använda @RequestHeader- anteckningen utan ett specifikt namn.

Vi har några val för vår variabeltyp: en karta , en MultiValueMap eller ett HttpHeaders- objekt.

Låt oss först få förfrågningsrubrikerna som en karta :

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

Om vi ​​använder en karta och en av rubrikerna har mer än ett värde får vi bara det första värdet . Detta motsvarar att använda metoden getFirst på en MultiValueMap .

Om våra rubriker kan ha flera värden 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("); return new ResponseEntity( String.format("Listed %d headers", headers.size()), HttpStatus.OK); }

Vi kan också få våra rubriker som ett HttpHeaders- objekt:

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

Den HttpHeaders objekt har accessors för vanliga programrubriker.

När vi öppnar en rubrik med namn från en karta , MultiValueMap eller HttpHeaders- objektet får vi en null om den inte finns.

3. @RequestHeader- attribut

Nu när vi har gått igenom grunderna för att komma åt begäran rubriker med @RequestHeader kommentaren, låt oss ta en närmare titt på dess attribut.

Vi har redan använt namn eller värde attribut implicit när vi har specifikt kallar vår rubrik:

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

Vi kan åstadkomma samma sak genom att använda namnet attributet:

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

Låt oss sedan använda värdeattributet på exakt samma sätt:

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

När vi namnger en rubrik specifikt krävs rubriken som standard. Om rubriken inte finns i begäran returnerar styrenheten ett 400-fel.

Låt oss använda attributet som krävs för att indikera att vårt huvud inte krävs:

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

Eftersom vår variabel kommer att vara noll om rubriken inte finns i begäran måste vi vara säker på att göra lämplig nollkontroll .

Låt oss använda attributet defaultValue för att tillhandahålla ett standardvärde för vårt huvud:

@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. Slutsats

I den här korta självstudien lärde vi oss hur vi får åtkomst till förfrågningsrubriker i Spring REST-kontroller. Först använde vi @RequestHeader- anteckningen för att tillhandahålla förfrågningsrubriker till våra controller-metoder.

Efter en titt på grunderna tog vi en detaljerad titt på attributen för @RequestHeader- anteckningen.

Exempelkoden finns tillgänglig på GitHub.