Chr*_*ris 12 java rest spring 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);
}
Run Code Online (Sandbox Code Playgroud)
使用headers = "Accept=application/xml"与使用消费= "application/xml"? 甚至使用有headers = "content-type=application/xml"什么区别?
有人可以解释标题和消耗/产生之间的差异,以及何时使用它们?
Ale*_*der 29
简短回答
在上面的示例中,使用headers = "Accept=application/xml"或produces = "application/xml"将以相同的方式响应客户端,即使用XML表示向客户端发送响应.
更长的回答
我.标头
对于RESTful Web服务,客户端(例如您的浏览器)向服务器发送请求(例如GET,POST等),服务器将发回响应.这是一个HTTP事务.请求和响应都有HTTP头字段("标题"),它定义HTTP事务的操作参数(我将客户端请求的头称为"请求头",这些与服务器响应的头不同"响应头").
由于您的浏览器向服务器发送请求的一部分,也有不同的请求头和一些例子包括Accept,Connection,Content-Length等,并且每个头都有自己的功能(在这里看到头的完整列表:HTTPS://en.wikipedia. org/wiki/List_of_HTTP_header_fields).
使用您的代码示例,如果客户端发出POST请求,Spring将检查请求标头,如果它找到Accept值为的标头application/xml,它会将请求映射到create您上面的方法(在您的情况下, server将向客户端返回XML响应表示.
让我修改headers您提供的代码中的元素:
@RequestMapping(method = RequestMethod.POST, headers = "Connection=keep-alive")
public User create(@RequestBody User user) {
...
}
Run Code Online (Sandbox Code Playgroud)
请注意,headers元素现在的值为Connection=keep-alive.如果客户端发出POST请求,Spring将检查请求标头,如果它找到Connection值为的标头keep-alive,它会将该客户端请求映射到create上面的方法.
II.生成和
使用如果您使用produces="application/xml"该create方法,这意味着客户端请求仅映射到create客户端Accept标头匹配的方法application/xml.这本质上是客户说,"嘿服务器,我更喜欢接受你的XML表示响应,所以用XML发送你的回复".实际上,produces="application/xml"也是服务器说,"嘿客户端,我只能用XML表示为你生成响应,所以我会发送给你那种格式".
链接到Spring文档参考.
如果您使用consumes="application/xml"了该create方法,则这意味着create如果客户端的Content-Type标头匹配,则客户端请求仅映射到该方法application/xml(Content-Type请求标头描述客户端请求进入的表示).这本质上是服务器说,"嘿客户端,我只能使用XML表示消费请求,所以将该格式发送给我".
发明内容
所述headers的范围内元件@RequestMapping注释可以采取不同的请求头(Accept,Connection,Cache-Control等),但该produces元件是只关注Accept请求报头和所述consumes元件是只关注Content-Type请求头.
正如(处理注释属性HeadersRequestCondition中提供的值)的javadoc所述headers@RequestMapping
传递给构造函数的标头名称为“Accept”或“Content-Type”的表达式将被忽略。看看
ConsumesRequestCondition并ProducesRequestCondition为那些。
所以不要在headers. 使用produces和consumes属性来Accept表示 和Content-Type。
至于如何使用它们,文档给出了示例:forconsumes和forproduces。
| 归档时间: |
|
| 查看次数: |
13380 次 |
| 最近记录: |