Lesen von HTTP-Headern in Spring REST-Controllern

1. Einleitung

In diesem kurzen Tutorial erfahren Sie, wie Sie in einem Spring Rest Controller auf HTTP-Header zugreifen.

Zunächst verwenden wir die Annotation @RequestHeader , um Header einzeln und alle zusammen zu lesen.

Danach werden wir uns die Attribute von @RequestHeader genauer ansehen .

2. Zugriff auf HTTP-Header

2.1. Individuell

Wenn wir Zugriff auf einen bestimmten Header benötigen, können wir @RequestHeader mit dem Headernamen konfigurieren :

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

Dann können wir mit der in unsere Methode übergebenen Variablen auf den Wert zugreifen. Wenn in der Anforderung kein Header mit dem Namen accept-language gefunden wird, gibt die Methode den Fehler "400 Bad Request" zurück.

Unsere Header müssen keine Zeichenfolgen sein. Wenn wir beispielsweise wissen, dass unser Header eine Zahl ist, können wir unsere Variable als numerischen Typ deklarieren:

@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. Alles auf einmal

Wenn wir nicht sicher sind, welche Header vorhanden sein werden, oder wenn wir mehr davon benötigen, als wir in der Signatur unserer Methode möchten, können wir die Annotation @RequestHeader ohne einen bestimmten Namen verwenden.

Wir haben einige Möglichkeiten für unseren Variablentyp: eine Map , eine MultiValueMap oder ein HttpHeaders- Objekt.

Lassen Sie uns zunächst die Anforderungsheader als Map abrufen :

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

Wenn wir eine Map verwenden und einer der Header mehr als einen Wert hat , erhalten wir nur den ersten Wert . Dies entspricht der Verwendung der getFirst- Methode in einer MultiValueMap .

Wenn unsere Header mehrere Werte haben können, können wir sie als MultiValueMap abrufen :

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

Wir können unsere Header auch als HttpHeaders- Objekt abrufen :

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

Das HttpHeaders- Objekt verfügt über Accessoren für allgemeine Anwendungsheader.

Wenn wir über eine Map , MultiValueMap oder das HttpHeaders- Objekt namentlich auf einen Header zugreifen , erhalten wir eine Null, wenn er nicht vorhanden ist.

3. @ RequestHeader- Attribute

Nachdem wir uns nun mit der Annotation @RequestHeader mit den Grundlagen des Zugriffs auf Anforderungsheader befasst haben , schauen wir uns die Attribute genauer an.

Wir haben bereits verwendet den Namen oder Wert Attribute implizit , wenn wir speziell unseren Header genannt haben:

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

Wir können das Gleiche erreichen , indem die Verwendung von Namen Attribut:

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

Als nächstes verwenden wir das value- Attribut genauso:

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

Wenn wir einen Header speziell benennen, ist der Header standardmäßig erforderlich. Wenn der Header in der Anforderung nicht gefunden wird, gibt der Controller einen 400-Fehler zurück.

Verwenden wir das erforderliche Attribut, um anzuzeigen, dass unser Header nicht erforderlich ist:

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

Da unsere Variable sein wird null , wenn der Header in der Anfrage nicht vorhanden ist , müssen wir sicher sein , die entsprechende tun null Prüfung.

Verwenden Sie das Attribut defaultValue , um einen Standardwert für unseren Header bereitzustellen:

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

In diesem kurzen Tutorial haben wir gelernt, wie Sie auf Anforderungsheader in Spring REST-Controllern zugreifen. Zuerst haben wir die Annotation @RequestHeader verwendet , um Anforderungsheader für unsere Controller-Methoden bereitzustellen .

Nach einem Blick auf die Grundlagen haben wir uns die Attribute für die Annotation @RequestHeader genauer angesehen .

Der Beispielcode ist über GitHub verfügbar.