如何访问 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-Encoding
和 Keep-Alive
标头值分别在 encoding
和 keepAlive
参数中提供。
不用担心。我们都是菜鸟。
【讨论】:
谢谢。在我工作的公司的一些代码示例中,我看到 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 项目中?
从 Spring MVC 控制器自动生成 REST api 文档到 RAML