Определить HTTP-версию входящего RequestEntity в SpringBoot 2.1 - PullRequest
1 голос
/ 25 апреля 2019

Я пытаюсь получить версию HTTP из входящего http-запроса в Spring (Spring Boot 2.1.4, в частности). Значение части HTTP 1.1, определенной как «HTTP-версия» в «строке запроса» в RFC2616: https://tools.ietf.org/html/rfc2616#section-5.1. Кажется, что Spring RequestEntity обладает всеми функциями для извлечения URL, пути, заголовков и т. Д., Но не для этого. Официальные документы тоже не помогают.

Рассмотрим следующий код:

@RestController
@RequestMapping("/")
public class MyController
{
    @GetMapping("/")
    @ResponseBody
    public ResponseEntity<String> getSomething(RequestEntity requestEntity)
    {
        // access HTTP Version number of incoming RequestEntity ***HERE***

При печати заголовков входящего запроса, например

Map<String, String> headers = requestEntity.getHeaders().toSingleValueMap();
Object[] keys = headers.keySet().toArray();

for(int i=0; i< headers.size(); i++) {
    System.out.println(keys[i].toString() + ": " + headers.get(keys[i].toString()));
}

(извините за мой грязный код регистрации), я получаю ФАКТИЧЕСКИЕ заголовки, такие как

host: localhost:8888
connection: keep-alive
cache-control: max-age=0
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36
dnt: 1
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9,de;q=0.8

Тем не менее, похоже, нет способа выделить номер версии HTTP из RequestEntity.

Есть ли хоть один?

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

RequestEntity - это представление запроса высокого уровня, которое позволяет вам удобно иметь доступ к полезной нагрузке в виде объекта.То, что вам нужно, это гораздо более низкоуровневый атрибут запроса, который обычно не должен беспокоить конечную точку REST.

Вы можете внедрить экземпляр HttpServletRequest, и это дает вам доступ к протоколу.

@GetMapping("/")
@ResponseBody    
public ResponseEntity<String> getSomething(RequestEntity requestEntity,
                                           HttpServletRequest request) {

  log.info("HTTP protocol: " + request.getProtocol());

  ...
}
0 голосов
/ 25 апреля 2019

Спасибо, @ Гимби.Также найдена следующая опция:

String httpVersion = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest().getProtocol;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...