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


154

我是Web编程的新手,尤其是Java语言的新手,所以我才了解到标头和正文是什么。

我正在使用Spring MVC编写RESTful服务。我可以@RequestMapping在控制器中创建简单的服务。我需要帮助来了解如何从REST服务控制器中的方法请求中获取HTTP标头信息。我想解析出标题并从中获取一些属性。

您能解释一下我如何获得这些信息吗?

Answers:


264

当您使用注释参数时@RequestHeader,参数将检索标题信息。因此,您可以执行以下操作:

@RequestHeader("Accept")

得到 Accept标题。

因此,从文档中

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

}

Accept-EncodingKeep-Alive在被提供标头值的encodingkeepAlive参数分别。

不用担心。我们都是菜鸟。


谢谢。在我工作的公司的一些代码示例中,我将HttpServletRequest作为参数,并且上面有一个getHeader方法。哪种方法更可取?
马之声

1
相对于API的底层细节,更喜欢抽象。我更希望Spring MVC抽象出ServletAPI 的细节。我可以使用注释将我需要的东西从请求中拉出来。
Vidya 2013年

6
应该提到的是,如果请求中不包含此类标头,则会收到400错误的请求错误作为响应。更灵活的方法是直接访问请求标头,如以下所述:stackoverflow.com/a/28209710/1828296
lospejos

我想这取决于您要执行的操作,但是在这种情况下,我几乎总是希望得到400响应。
Vidya

通过使用required类似的标志可以避免的@lospejos @RequestHeader(name = "Keep-Alive", required = false) long keepAlive会将keepAlive设置为null(如果未提供)。还有一个defaultValue领域注释docs.spring.io/spring-framework/docs/5.0.7.RELEASE/javadoc-api/...
尼可罗马基

88

您可以使用@RequestHeaderHttpHeaders方法参数的注释来访问所有请求标头:

@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是否是我需要密钥才能访问的映射?
马之声

HttpHeaders具有获取标题的吸气剂。您可以浏览此链接以获取详细信息:docs.spring.io/spring/docs/3.1.x/javadoc-api/org/…–
Debojit Saikia

编辑了我的答案,以显示如何访问请求正文。
Debojit Saikia

1
为什么需要流源?看来太复杂了。必须有比使用更简单的方式流等
马声音

这里StringReader用来读取传入的字符流。StreamSource以XML标记流的形式充当转换源的持有者。
Debojit Saikia 2013年

14

我在Header参数示例中的解决方案是user =“ test”是:

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

System.out.println(headers.get("user"));
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.