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事务的操作参数(我将客户端请求的头称为“请求头”,这些与服务器响应的头不同“响应头“)。
作为您的浏览器发送到服务器的请求的一部分,有不同的请求标头,一些示例包括Accept
, Connection
, Content-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
元素可以使用不同的请求标头( Accept
, Connection
, Cache-Control
等),但produces
元素仅涉及Accept
请求标头,而consumes
元素仅涉及Content-Type
请求头。
作为HeadersRequestCondition
的javadoc(它处理@RequestMapping
注释的headers
属性中提供的值)状态
传递给构造函数的表达式名称为“Accept”或“Content-Type”将被忽略。 请参阅
ConsumesRequestCondition
和ProducesRequestCondition
。
所以不要在headers
使用这些headers
。 使用Accept
和Content-Type
的produces
和consumes
属性。
至于如何使用它们,文档给出了例子: consumes
和produces
。