Как да четем HTTP заглавия през пролетта REST контролери

1. Въведение

В този бърз урок ще разгледаме как да осъществим достъп до HTTP заглавия в Spring Rest Controller.

Първо, ще използваме анотацията @RequestHeader, за да четем заглавията поотделно, както и всички заедно.

След това ще разгледаме по-задълбочено атрибутите на @RequestHeader .

2. Достъп до HTTP заглавия

2.1. Индивидуално

Ако се нуждаем от достъп до конкретна заглавка, можем да конфигурираме @RequestHeader с името на заглавката:

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

След това можем да получим достъп до стойността, като използваме променливата, предадена в нашия метод. Ако в заявката не се намери заглавка с име на език за приемане, методът връща грешка „400 Bad Request“.

Нашите заглавки не трябва да бъдат низове. Например, ако знаем, че заглавката ни е число, можем да декларираме нашата променлива като числов тип:

@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. Всичко наведнъж

Ако не сме сигурни кои заглавки ще присъстват или се нуждаем от повече от тях, отколкото искаме в подписа на нашия метод, можем да използваме анотацията @RequestHeader без конкретно име.

Имаме няколко възможности за избор на нашия тип променлива: Map , MultiValueMap или HttpHeaders обект.

Първо, нека вземем заглавките на заявките като Карта :

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

Ако използваме Map и една от заглавките има повече от една стойност , ще получим само първата стойност . Това е еквивалентът на помощта на getFirst метода на MultiValueMap .

Ако нашите заглавки могат да имат множество стойности, можем да ги получим като 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); }

Също така можем да получим заглавките си като обект HttpHeaders :

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

Обектът HttpHeaders има аксесоари за общи заглавки на приложения.

Когато имаме достъп до заглавка по име от обект Map , MultiValueMap или HttpHeaders , ще получим нула, ако тя не присъства.

3. Атрибути @RequestHeader

След като разгледахме основите на достъпа до заглавките на заявките с анотацията @RequestHeader , нека разгледаме по-отблизо нейните атрибути.

Вече сме използвали атрибутите name или value неявно, когато специално сме нарекли заглавката си:

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

Можем да постигнем същото, като използваме атрибута name :

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

След това нека използваме атрибута value точно по същия начин:

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

Когато назоваваме заглавието специално, заглавието се изисква по подразбиране. Ако заглавката не е намерена в заявката, контролерът връща грешка 400.

Нека използваме задължителния атрибут, за да посочим, че заглавката ни не е необходима:

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

Тъй като нашата променлива ще бъде нула, ако заглавката не присъства в заявката , трябва да сме сигурни, че правим съответната проверка на нула .

Нека използваме атрибута defaultValue , за да предоставим стойност по подразбиране за нашия хедър:

@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. Заключение

В този кратък урок научихме как да получим достъп до заглавките на заявки в Spring REST контролери. Първо, използвахме анотацията @RequestHeader, за да предоставим заглавки на заявките на нашите методи на контролер.

След като разгледахме основите, разгледахме подробно атрибутите за анотацията @RequestHeader .

Примерният код е достъпен в GitHub.