Spring 4 @RequestMapping - 使用vs头文件?

时间:2015-06-18 18:41:03

标签: java spring rest spring-mvc

我正在学习如何使用Spring 4构建RESTful Web服务,而我不清楚的一件事是在@RequestMapping中。我已经看过使用headers = "Accept=application/xml"和其他使用消费(或产生)= "application/xml"的示例的示例。

例如,在我自己的@RestController类中,我有这个函数......

// POST
@RequestMapping(method = RequestMethod.POST, headers = "Accept=application/xml")
public User create(@RequestBody User user) {
    LOG.info("User = " + user.toString());
return userService.create(user);
}

使用headers = "Accept=application/xml"与使用消费= "application/xml"?或使用headers = "content-type=application/xml"之间有什么区别?

有人可以解释标题和消耗/产生之间的差异,以及何时使用它们?

2 个答案:

答案 0 :(得分:27)

简短回答
在上面的示例中,使用headers = "Accept=application/xml"produces = "application/xml"将以相同的方式响应客户端,即使用XML表示向客户端发送响应。

LONGER ANSWER
我。头
对于RESTful Web服务,客户端(例如您的浏览器)向服务器发送请求(例如GET,POST等),服务器将发回响应。这是一个HTTP事务。请求和响应都有HTTP头字段(“标题”),它定义HTTP事务的操作参数(我将客户端请求的头称为“请求头”,这些与服务器响应的头不同“响应头“)。

作为您的浏览器发送到服务器的请求的一部分,有不同的请求标头,一些示例包括AcceptConnectionContent-Length等等,每个标头都有自己的标题函数(请参阅此处的完整标题列表:https://en.wikipedia.org/wiki/List_of_HTTP_header_fields)。

使用您的代码示例,如果客户端发出POST请求,Spring将检查请求标头,如果它找到值为Accept的标头application/xml,它将映射请求上面的create方法(在您的情况下,服务器将向客户端返回XML响应表示)。

让我修改您提供的代码中的headers元素:

@RequestMapping(method = RequestMethod.POST, headers = "Connection=keep-alive")
public User create(@RequestBody User user) {
 ...
}

请注意,headers元素现在的值为Connection=keep-alive。如果客户端发出POST请求,Spring将检查请求标头,如果它找到值为Connection的标头keep-alive,它会将该客户端请求映射到{{1}上面的方法。

<强> II。生产和消费
如果您使用create作为produces="application/xml"方法,则表示如果客户端的create标头与create匹配,则客户端请求仅映射到Accept方法。这本质上是客户说,“嘿服务器,我更喜欢接受你的XML表示响应,所以用XML发送你的回复”。实际上,application/xml也是服务器说“嘿客户端,我只能用XML表示为你生成响应,所以我会发送给你那种格式”。 Link to Spring documentation reference

如果您使用produces="application/xml"作为consumes="application/xml"方法,则表示如果客户端的create标头与create匹配,则客户端请求仅映射到Content-Type方法(application/xml请求标头描述客户端请求进入的表示)。这本质上是服务器说,“嘿客户端,我只能使用XML表示消费请求,所以将该格式发送给我”。

<强>概要
Content-Type注释中的headers元素可以采用不同的请求标头(@RequestMappingAcceptConnection等),但Cache-Control元素仅涉及produces请求标头,Accept元素仅涉及consumes请求标头。

答案 1 :(得分:3)

作为HeadersRequestCondition的javadoc(处理headers注释的@RequestMapping属性中提供的值)状态

  

表达式传递给构造函数,标题名称为“Accept”或   'Content-Type'被忽略。见ConsumesRequestCondition和   对于那些人ProducesRequestCondition

因此,请勿在{{1​​}}中使用这些标头。使用headersproduces的{​​{1}}和consumes属性。

关于如何使用它们,文档提供了示例:for consumesfor produces