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

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

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

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

【问题讨论】:

    标签: spring rest http spring-mvc request-headers


    【解决方案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 错误作为响应。更灵活的方法是直接访问请求标头,如:stackoverflow.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/…
        猜你喜欢
        • 2015-03-28
        • 2017-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-02
        • 1970-01-01
        • 2011-04-27
        • 1970-01-01
        相关资源
        最近更新 更多