spring是如何获得前端数据(如何在SpringRESTController中获取header信息)

spring是如何获得前端数据(如何在SpringRESTController中获取header信息)(1)

1. 概述

在这个快速教程中,我们将了解如何在Spring Rest控制器中访问HTTP头信息。

首先,我们将使用@RequestHeader注释分别读取头信息,也可以一起读取头信息。

之后,我们将深入了解@RequestHeader的属性。

2. 访问HTTP头2.1. 简单方法

如果我们需要访问一个特定的标题,我们可以配置@RequestHeader的标题名称:

@GetMapping("/greeting") publicResponseEntity<String>greeting(@RequestHeader("accept-language")Stringlanguage){ //codethatusesthelanguagevariable returnnewResponseEntity<String>(greeting,HttpStatus.OK); }

然后,我们可以使用传入方法的变量来访问值。如果在请求中没有找到名为accept-language的头,该方法将返回一个“400 Bad request”错误。

我们的头不必是字符串。例如,如果我们知道我们的头是一个数字,我们可以声明我们的变量为数值类型:

@GetMapping("/double") publicResponseEntity<String>doubleNumber(@RequestHeader("my-number")intmyNumber){ returnnewResponseEntity<String>(String.format("%d*2=%d", myNumber,(myNumber*2)),HttpStatus.OK); }

2.2. 一次性获取

如果我们不确定将出现哪些头,或者我们需要在方法签名中更多的头,我们可以使用@RequestHeader注释,而不需要特定的名称。

我们的变量类型有几个选择:Map、MultiValueMap或HttpHeaders对象。

首先,让我们以映射的方式获取请求头信息:

@GetMapping("/listHeaders") publicResponseEntity<String>listAllHeaders( @RequestHeaderMap<String,String>headers){ headers.forEach((key,value)->{ LOG.info(String.format("Header'%s'=%s",key,value)); }); returnnewResponseEntity<String>( String.format("Listed%dheaders",headers.size()),HttpStatus.OK); }

如果我们使用一个Map,而其中一个头文件有多个值,我们将只获得第一个值。这相当于MultiValueMap上使用getFirst方法。

如果我们的头可能有多个值,我们可以获得他们作为一个MultiValueMap:

@GetMapping("/multiValue") publicResponseEntity<String>multiValue( @RequestHeaderMultiValueMap<String,String>headers){ headers.forEach((key,value)->{ LOG.info(String.format( "Header'%s'=%s",key,value.stream().collect(Collectors.joining("|")))); }); returnnewResponseEntity<String>( String.format("Listed%dheaders",headers.size()),HttpStatus.OK); }

我们也可以获得我们的头作为HttpHeaders对象:

@GetMapping("/getBaseUrl") publicResponseEntity<String>getBaseUrl(@RequestHeaderHttpHeadersheaders){ InetSocketAddresshost=headers.getHost(); Stringurl="http://" host.getHostName() ":" host.getPort(); returnnewResponseEntity<String>(String.format("BaseURL=%s",url),HttpStatus.OK); }

HttpHeaders对象具有通用应用程序头的访问器.

当我们通过名称从Map、MultiValueMap或HttpHeaders对象访问一个头时,如果它不存在,我们将得到一个空值。

3. @RequestHeader 属性

现在我们已经讨论了使用@RequestHeader注释访问请求头的基础知识,让我们进一步看看它的属性。

我们已经隐式地使用了名称或值属性,当我们指定我们的头:

publicResponseEntity<String>greeting(@RequestHeader("accept-language")Stringlanguage){}

我们可以通过使用name属性完成同样的事情:

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

接下来,让我们以同样的方式使用value属性:

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

当我们指定一个头时,默认情况下需要这个头。如果在请求中没有找到header,控制器将返回一个400错误。

让我们使用required属性来表示我们的头文件不是必需的:

@GetMapping("/nonRequiredHeader") publicResponseEntity<String>evaluateNonRequiredHeader( @RequestHeader(value="optional-header",required=false)StringoptionalHeader){ returnnewResponseEntity<String>(String.format( "Wastheoptionalheaderpresent?%s!", (optionalHeader==null?"No":"Yes")),HttpStatus.OK); }

因为如果请求中没有头文件,我们的变量将为空,所以我们需要确保进行适当的空检查。

让我们使用defaultValue属性为我们的头文件提供一个默认值:

@GetMapping("/default") publicResponseEntity<String>evaluateDefaultHeaderValue( @RequestHeader(value="optional-header",defaultValue="3600")intoptionalHeader){ returnnewResponseEntity<String>( String.format("OptionalHeaderis%d",optionalHeader),HttpStatus.OK); }

4. 结论

在这个简短的教程中,我们学习了如何在Spring REST控制器中访问请求头。首先,我们使用@RequestHeader注释为控制器方法提供请求头。

在了解了基础知识之后,我们详细了解了@RequestHeader注释的属性。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页