我正在尝试从Spring中的传入http请求中获取HTTP版本(特别是Spring Boot 2.1.4)。意味着HTTP 1.1
部分在RFC2616的“请求行”中定义为“ HTTP版本”: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()));
}
(请原谅我的脏日志代码),我得到了ACTUAL标头,例如
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
仍然,似乎没有办法从RequestEntity中剔除HTTP版本号。
有没有人?
答案 0 :(得分:1)
RequestEntity是请求的高级表示,它使您可以方便地访问对象形式的有效负载。您所追求的是请求的低级属性,通常REST端点不必理会它。
您可以注入HttpServletRequest实例,从而使您可以访问协议。
@GetMapping("/")
@ResponseBody
public ResponseEntity<String> getSomething(RequestEntity requestEntity,
HttpServletRequest request) {
log.info("HTTP protocol: " + request.getProtocol());
...
}
答案 1 :(得分:0)
谢谢@Gimby。还找到了以下选项:
String httpVersion = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest().getProtocol;