在本篇文章中,我们将研究如何在 Spring Rest Controller 中访问 HTTP 头信息。
首先,我们将使用 @RequestHeader 注解分别或同时读取 HTTP 头信息。
之后,我们将深入研究 @RequestHeader 的属性。
如果我们需要访问一个特定的 HTTP 头信息,我们可以 用头名配置 @RequestHeader :
@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); } 复制代码
如果我们不确定会出现哪些头文件,或者我们需要的头文件比方法签名中需要的多,我们可以使用 @RequestHeader 注释,而不需要特定的名称。
对于变量类型,我们有几种选择:Map,MultiValueMap 或 HttpHeaders 对象。
首先,让我们以 Map 的形式获取请求的头信息:
@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 进行获取:
@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 对象 获取:
@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); } 复制代码
现在,我们已经了解了使用 @RequestHeader 注解获取请求头的基础知识,让我们仔细看一下其属性。
当我们指定 Header 时,我们已经隐式地使用了 name 或 value 属性:
public ResponseEntity<String> greeting( @RequestHeader("accept-language") String language) {} 复制代码
我们可以通过使用 name 属性来完成同样的事情:
public ResponseEntity<String> greeting( @RequestHeader(name = "accept-language") String language) {} 复制代码
接下来,让我们以完全相同的方式使用 value 属性:
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