如何在 Spring REST Controller 中获取 HTTP 头信息

介绍

在本篇文章中,咱们将研究如何在 Spring Rest Controller 中访问 HTTP 头信息。
首先,咱们将使用 @RequestHeader 注解分别或同时读取 HTTP 头信息。
以后,咱们将深刻研究 @RequestHeader 的属性。java

获取 HTTP 头信息

获取单个 HTTP 头信息

若是咱们须要访问一个特定的 HTTP 头信息,咱们能够用头名配置 @RequestHeaderapp

@GetMapping("/greeting")
public ResponseEntity<String> greeting(@RequestHeader("accept-language") String language) {
    // 使用 language 变量的代码
    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);
}

获取多个 HTTP 头信息

若是咱们不肯定会出现哪些头文件,或者咱们须要的头文件比方法签名中须要的多,咱们可使用 @RequestHeader 注释,而不须要特定的名称。
对于变量类型,咱们有几种选择:Map,MultiValueMap 或 HttpHeaders 对象。
首先,让咱们以 Map 的形式获取请求的头信息:ui

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

若是咱们使用 Map,而且其中一个头信息具备多个值,则只能得到第一个值。这等效于在 MultiValueMap 上使用 getFirst() 方法。
若是咱们的头信息可能有多个值,咱们能够将它们做为 MultiValueMap 进行获取:lua

@GetMapping("/multiValue")
public ResponseEntity<String> multiValue(@RequestHeader MultiValueMap<String, String> headers) {
    headers.forEach((key, value) -> {
        LOG.info(String.format(
          "Header '%s' = %s", key, value.stream().collect(Collectors.joining("|"))));
    });
         
    return new ResponseEntity<String>(
      String.format("Listed %d headers", headers.size()), HttpStatus.OK);
}

咱们还能够将 headers 做为 HttpHeaders 对象获取:url

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

当咱们从 Map,MultiValueMap 或 HttpHeaders 对象中按名称访问头信息时,若是不存在则返回空。code

@RequestHeader 属性

如今,咱们已经了解了使用 @RequestHeader 注解获取请求头的基础知识,让咱们仔细看一下其属性。
当咱们指定 Header 时,咱们已经隐式地使用了 name 或 value 属性:orm

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

咱们能够经过使用 name 属性来完成一样的事情:对象

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

接下来,让咱们以彻底相同的方式使用 value 属性:blog

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

当咱们指定获取一个头信息时,默认状况下该头信息是必需的。 若是在请求中没有找到该头信息,控制器将返回一个 400 错误。
咱们可使用 required 属性来表示咱们的头不是必需的:

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

若是该头信息在请求头中不存在,则变量将为 null, 所以确保程序可以正常运行,咱们进行适当的空值检查。
让咱们使用 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);
}

结束语

在这个简短的教程中,咱们学习了如何在 Spring REST Controllers 中访问请求头。首先,咱们使用 @RequestHeader 注解为 Controller 方法获取请求头。
在了解了基础知识以后,咱们详细研究了 @RequestHeader 注解的属性。

欢迎关注个人公众号:曲翎风,得到独家整理的学习资源和平常干货推送。
若是您对个人专题内容感兴趣,也能够关注个人博客: sagowiec.com
相关文章
相关标签/搜索