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

我正在学习如何使用Spring 4构建RESTful Web服务,有一点我不清楚是在@RequestMapping中。 我见过一些例子,其中一个使用headers = "Accept=application/xml" ,其他例子使用consume(或产生) = "application/xml"

例如,在我自己的@RestController类中,我有这个function……

 // 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"与使用consumes = "application/xml"?之间有什么区别= "application/xml"? 甚至使用headers = "content-type=application/xml"

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

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

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

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

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

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

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

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

II。 生产和消费
如果对create方法使用了produces="application/xml" ,则表示如果客户端的Accept标头与application/xml匹配,则客户端请求仅映射到create方法。 这本质上是客户说,“嘿服务器,我更愿意接受你的XML表示响应,所以用XML发送你的回复”。 有效地,produce produces="application/xml"也是服务器说“嘿客户端,我只能用XML表示为你生成响应,所以我会发送给你那个格式”。 链接到Spring文档参考 。

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

摘要
@RequestMapping批注中的headers元素可以使用不同的请求标头( AcceptConnectionCache-Control等),但produces元素仅涉及Accept请求标头,而consumes元素仅涉及Content-Type请求头。

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

传递给构造函数的表达式名称为“Accept”或“Content-Type”将被忽略。 请参阅ConsumesRequestConditionProducesRequestCondition

所以不要在headers使用这些headers 。 使用AcceptContent-Typeproducesconsumes属性。

至于如何使用它们,文档给出了例子: consumesproduces