Автор оригинала: Amy DeGregorio.
1. введение
В этом кратком руководстве мы рассмотрим, как получить доступ к заголовкам HTTP в контроллере Spring Rest .
Во-первых, мы будем использовать аннотацию @RequestHeader для чтения заголовков по отдельности, а также всех вместе.
После этого мы более подробно рассмотрим атрибуты @RequestHeader ‘set.
Дальнейшее чтение:
Весеннее сопоставление запросов
Как установить заголовок в ответе с помощью Spring 5
Использование Spring ResponseEntity для управления HTTP-ответом
2. Доступ к заголовкам HTTP
2.1. Индивидуально
Если нам нужен доступ к определенному заголовку, мы можем настроить @RequestHeader с именем заголовка:
@GetMapping("/greeting") public ResponseEntitygreeting(@RequestHeader("accept-language") String language) { // code that uses the language variable return new ResponseEntity (greeting, HttpStatus.OK); }
Затем мы можем получить доступ к значению, используя переменную, переданную в наш метод. Если заголовок с именем accept-language не найден в запросе, метод возвращает ошибку “400 неверных запросов”.
Наши заголовки не обязательно должны быть строками. Например, если мы знаем, что наш заголовок-это число, мы можем объявить нашу переменную как числовой тип:
@GetMapping("/double") public ResponseEntitydoubleNumber(@RequestHeader("my-number") int myNumber) { return new ResponseEntity (String.format("%d * 2 = %d", myNumber, (myNumber * 2)), HttpStatus.OK); }
2.2. Все сразу
Если мы не уверены, какие заголовки будут присутствовать, или нам нужно их больше, чем мы хотим, в подписи нашего метода, мы можем использовать аннотацию @RequestHeader без определенного имени.
У нас есть несколько вариантов для вашего типа переменной: a Карта , a Многозначная карта или Заголовки Http объект.
Во-первых, давайте получим заголовки запросов в виде Map :
@GetMapping("/listHeaders") public ResponseEntitylistAllHeaders( @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 на многозначной карте .
Если наши заголовки могут иметь несколько значений, мы можем получить их в виде Многозначная карта :
@GetMapping("/multiValue") public ResponseEntitymultiValue( @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 ResponseEntitygetBaseUrl(@RequestHeader HttpHeaders headers) { InetSocketAddress host = headers.getHost(); String url = "http://" + host.getHostName() + ":" + host.getPort(); return new ResponseEntity (String.format("Base URL = %s", url), HttpStatus.OK); }
Объект Http Headers имеет средства доступа для общих заголовков приложений.
Когда мы обращаемся к заголовку по имени из Карта , Многозначная карта или Заголовки Http объект, мы получим нулевой если его нет.
3. Атрибуты @RequestHeader
Теперь, когда мы рассмотрели основы доступа к заголовкам запросов с помощью аннотации @RequestHeader , давайте подробнее рассмотрим ее атрибуты.
Мы уже использовали атрибуты name или value неявно, когда специально называли наш заголовок:
public ResponseEntitygreeting(@RequestHeader("accept-language") String language) {}
Мы можем сделать то же самое, используя атрибут name :
public ResponseEntitygreeting( @RequestHeader(name = "accept-language") String language) {}
Далее, давайте использовать атрибут value точно так же:
public ResponseEntitygreeting( @RequestHeader(value = "accept-language") String language) {}
Когда мы специально называем заголовок, заголовок требуется по умолчанию. Если заголовок не найден в запросе, контроллер возвращает ошибку 400.
Давайте используем атрибут required , чтобы указать, что наш заголовок не требуется:
@GetMapping("/nonRequiredHeader") public ResponseEntityevaluateNonRequiredHeader( @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); }
Поскольку наша переменная будет null , если заголовок отсутствует в запросе , нам нужно обязательно выполнить соответствующую проверку null .
Давайте используем атрибут defaultValue , чтобы указать значение по умолчанию для нашего заголовка:
@GetMapping("/default") public ResponseEntityevaluateDefaultHeaderValue( @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 .