在Spring MVC REST控制器中如何获取HTTP标头信息?

184

我对Web编程一般都不太了解,特别是在Java方面。我刚学会了头部和正文的基本知识。

我正在使用Spring MVC编写RESTful服务。我能够在我的控制器中使用@RequestMapping创建简单的服务。我需要帮助理解如何从请求中获取HTTP标头信息,并将其解析出来以获得一些属性。

您可以解释一下如何获取这些信息吗?

4个回答

305

当您使用@RequestHeader注释参数时,该参数会检索标头信息。因此,您可以像这样执行操作:

当您使用@RequestHeader注释参数时,该参数会检索标头信息。因此,您可以像这样执行操作:

@RequestHeader("Accept")

获取 Accept 头信息。

所以根据文档

@RequestMapping("/displayHeaderInfo.do")
public void displayHeaderInfo(@RequestHeader("Accept-Encoding") String encoding,
                              @RequestHeader("Keep-Alive") long keepAlive)  {

}

encodingkeepAlive参数中分别提供了Accept-EncodingKeep-Alive头值。

不用担心。我们都是菜鸟中的一员。


谢谢。在我工作的公司的一些代码示例中,我看到HttpServletRequest作为参数,并且它有一个getHeader方法。哪种方法更可取? - Horse Voice
1
更喜欢使用API的抽象层而非低级细节。我更愿意让Spring MVC抽象出Servlet API的细节,我可以使用注解从请求中获取所需内容。 - Vidya
7
如果请求中不包含这个头部信息,会得到一个400错误响应。更灵活的方法是直接访问请求头,如此链接所述:https://dev59.com/5F4c5IYBdhLWcg3wMnz1#28209710 - lospejos
我猜这取决于你想做什么,但在那种情况下,400响应是我几乎总是想要的行为。 - Vidya
2
@lospejos,可以通过使用required标志来避免这种情况,例如@RequestHeader(name = "Keep-Alive", required = false) long keepAlive,如果未提供,则会将keepAlive设置为null。此外,注释中还有defaultValue字段 https://docs.spring.io/spring-framework/docs/5.0.7.RELEASE/javadoc-api/org/springframework/web/bind/annotation/RequestHeader.html - Niccolò

95
您可以使用@RequestHeader注释和HttpHeaders方法参数来访问所有请求头:
@RequestMapping(value = "/restURL")
public String serveRest(@RequestBody String body, @RequestHeader HttpHeaders headers) {
    // Use headers to get the information about all the request headers
    long contentLength = headers.getContentLength();
    // ...
    StreamSource source = new StreamSource(new StringReader(body));
    YourObject obj = (YourObject) jaxb2Mashaller.unmarshal(source);
    // ...
}

HTTP请求的正文怎么办?我如何访问头部信息?您能否解释一下HttpHeaders是否是一个需要键来访问的映射表? - Horse Voice
HttpHeaders有getter方法来获取头部信息,你可以查看这个链接以获取详情:http://docs.spring.io/spring/docs/3.1.x/javadoc-api/org/springframework/http/HttpHeaders.html - Debojit Saikia
我编辑了我的答案,展示了如何获取请求体的访问权限。 - Debojit Saikia
1
为什么需要StreamSource?它看起来太复杂了。一定有比使用流更简单的方法。 - Horse Voice
这里使用 StringReader 读取传入的字符流。StreamSource 作为一个容器,存储转换源以及一系列的 XML 标记流。 - Debojit Saikia
正是我所需要的。 您可以使用请求参数执行类似的技巧:https://dev59.com/Amw05IYBdhLWcg3wUAQ0#18489124 - Rob Worsnop

18

我的标题参数解决方案示例中的user="test"是:

@RequestMapping(value = "/restURL")
  public String serveRest(@RequestBody String body, @RequestHeader HttpHeaders headers){

System.out.println(headers.get("user"));
}

0

您可以使用HttpEntity来读取请求体和请求头。

   @RequestMapping(value = "/restURL")
   public String serveRest(HttpEntity<String> httpEntity){
                MultiValueMap<String, String> headers = 
                httpEntity.getHeaders();
                Iterator<Map.Entry<String, List<String>>> s = 
                headers.entrySet().iterator();
                while(s.hasNext()) {
                    Map.Entry<String, List<String>> obj = s.next();
                    String key = obj.getKey();
                    List<String> value = obj.getValue();
                }
                
                String body = httpEntity.getBody();

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接