黑客日教程-如何在Spring REST Controller读取http头信息

黑客日教程-如何在Spring REST Controller读取http头信息

1 简介

本文将介绍如何在Spring REST Controller读取http头信息。
首先,使用@RequestHeader注解可以单独或一次性读取头信息。
然后,深入研究下@RequestHeader的属性。

2 获取http头信息

2.1 单个读取

如何要访问特定头信息,可以用头信息名称来配置@RequestHeader:

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

然后用相对应的参数来访问到头信息的值。如果某个头信息比如accept-language没有找到,那么方法返回”400 Bad Request”错误。
头信息不一定必须是字符串,如果知道头信息是数字,可以定义一个数字类型:

@GetMapping("/double")
public ResponseEntity<String> doubleNumber(@RequestHeader("my-number") int myNumber) {
    return new ResponseEntity<String>(String.format("%d * 2 = %d", 
      myNumber, (myNumber * 2)), HttpStatus.OK);
}

2.2 一次性

如果不确定会有哪些头信息,或者需要更详细的细节,使用@RequestHeader的时候不写任何头信息名称,就能获取所有信息。 这种情况,可以使用Map、MultiValueMap或HttpHeaders来作为参数。

@GetMapping("/listHeaders")
public ResponseEntity<String> listAllHeaders(@RequestHeader Map<String, String> headers) {
    headers.forEach((key, value) -> {
        LOG.info(String.format("Header '%s' = %s", key, value));
    });
 
    return new ResponseEntity<String>(String.format("Listed %d headers", headers.size()), HttpStatus.OK);
}

使用HttpHeaders:

@GetMapping("/getBaseUrl")
public ResponseEntity<String> getBaseUrl(@RequestHeader HttpHeaders headers) {
    InetSocketAddress host = headers.getHost();
    String url = "http://" + host.getHostName() + ":" + host.getPort();
    return new ResponseEntity<String>(String.format("Base URL = %s", url), HttpStatus.OK);
}

HttpHeaders有accesssor支持常见的头信息。
从Map、MultiValueMap、HttpHeaders获取某个头信息的时候,如果该信息不存在,则返回null。

黑客日,Java菜鸟到高手,从关注业界最新动态开始!从入门教程开始!

 

3 @RequestHeader属性

上面的例子里面已经隐式使用了name和value属性。

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

这例子等于:

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

也等于:

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

如果指定了头信息的名称,那么required属性就是默认为true的。这时,如果头信息没有找到就会返回400错误。下面的例子,设置required为false:

@GetMapping("/nonRequiredHeader")
public ResponseEntity<String> evaluateNonRequiredHeader(
  @RequestHeader(value = "optional-header", required = false) String optionalHeader) {
    return new ResponseEntity<String>(
      String.format("Was the optional header present? %s!", (optionalHeader == null ? "No" : "Yes")), 
      HttpStatus.OK);
}

defaultValue可以用来防护头信息为空的场景:

@GetMapping("/default")
public ResponseEntity<String> evaluateDefaultHeaderValue(
  @RequestHeader(value = "optional-header", defaultValue = "3600") int optionalHeader) {
    return new ResponseEntity<String>(String.format("Optional Header is %d", optionalHeader), 
    HttpStatus.OK);
}

4 结论

本文学习了如何在Spring REST Controller中读取头信息。
代码示例在github

来源

发表评论