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

Posted

技术标签:

【中文标题】如何访问 Spring MVC REST 控制器中的 HTTP 标头信息?【英文标题】:How to get access to HTTP header information in Spring MVC REST controller? 【发布时间】:2013-11-02 13:50:07 【问题描述】:

我是 Web 编程的新手,尤其是 Java,所以我刚刚了解了什么是 header 和 body。

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

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

【问题讨论】:

【参考方案1】:

您可以使用 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();

    

【讨论】:

【参考方案2】:

您可以使用@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 是我需要密钥才能访问的地图,您能向我解释一下吗? HttpHeaders 具有获取标头细节的方法。您可以浏览此链接以获取详细信息:docs.spring.io/spring/docs/3.1.x/javadoc-api/org/… 编辑了我的答案,展示了如何访问请求正文。 为什么需要流源?好像太复杂了。必须有比使用流等更简单的方法。 这里StringReader用于读取传入的字符流。 StreamSource 作为 XML 标记流形式的转换源的持有者。【参考方案3】:

我在标头参数中的解决方案是 user="test" 是:

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

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

【讨论】:

【参考方案4】:

当您使用@RequestHeader 注释参数时,该参数将检索标头信息。所以你可以这样做:

@RequestHeader("Accept")

获取Accept 标头。

所以来自documentation:

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


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

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

【讨论】:

谢谢。在我工作的公司的一些代码示例中,我看到 HttpServletRequest 作为参数,并且上面有一个 getHeader 方法。哪种方法更可取? 更喜欢抽象而不是 API 的低级细节。我宁愿让 Spring MVC 抽象出 Servlet API 的细节。我可以使用注释从请求中提取我需要的内容。 应该提一下,如果请求不包含此类标头,您将收到 400 bad request 错误作为响应。更灵活的方法是直接访问请求标头,如:***.com/a/28209710/1828296 我想这取决于你想要做什么,但 400 响应是我在这种情况下几乎总是想要的行为。 @lospejos 可以通过使用 required 标志(如 @RequestHeader(name = "Keep-Alive", required = false) long keepAlive)来避免,如果未提供,则会将 keepAlive 设置为 null。还有defaultValue字段用于注解docs.spring.io/spring-framework/docs/5.0.7.RELEASE/javadoc-api/…

以上是关于如何访问 Spring MVC REST 控制器中的 HTTP 标头信息?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Oauth2.0 合并到现有的 Java Spring Web MVC 和 REST 项目中?

通过 REST 在 Spring MVC 中进行身份验证

测试一个spring mvc rest控制器

从 Spring MVC 控制器自动生成 REST api 文档到 RAML

如何在 Spring-Data-Rest 中实现细粒度的访问控制?

Spring MVC 转换 Spring Rest Api