简短回答
在上面的示例中,使用 headers = "Accept=application/xml" 或 produces = "application/xml" 都将以相同的方式响应客户端,即使用 XML 表示向客户端发送响应。
更长的答案
我。标题
对于 RESTful Web 服务,客户端(例如您的浏览器)向服务器发送请求(例如 GET、POST 等),服务器将返回响应。这是一个 HTTP 事务。请求和响应都有 HTTP 标头字段(“headers”),它定义了 HTTP 事务的操作参数(我将客户端请求的标头称为“请求标头”,这些与来自服务器响应的标头“响应”不同标题")。
作为浏览器向服务器发送的请求的一部分,有不同的请求标头,一些示例包括 Accept、Connection、Content-Length 等,每个标头都有自己的功能(请参阅完整列表这里的标题:https://en.wikipedia.org/wiki/List_of_HTTP_header_fields)。
使用您的代码示例,如果客户端发出 POST 请求,Spring 将检查请求标头,如果发现标头 Accept 的值为 application/xml,它会将请求映射到 @ 987654331@ 上面的方法(在您的情况下,服务器将向客户端返回 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.生产和消费
如果您将produces="application/xml" 用于create 方法,这意味着只有当客户端的Accept 标头与application/xml 匹配时,客户端请求才会映射到create 方法。这实质上是客户端说,“嘿,服务器,我更愿意接受您以 XML 表示形式的响应,所以将您的响应以 XML 形式发送给我”。实际上,produces="application/xml" 也是服务器在说,“嘿,客户端,我只能以 XML 表示形式为您生成响应,所以我将向您发送该格式”。
Link to Spring documentation reference.
如果您将consumes="application/xml" 用于create 方法,这意味着如果客户端的Content-Type 标头与application/xml 匹配,则客户端请求仅映射到create 方法(Content-Type 请求标头描述了表示客户端请求即将到来)。这实质上是服务器在说,“嘿,客户端,我只能使用 XML 表示的请求,所以将该格式发送给我”。
总结
@RequestMapping 注解中的 headers 元素可以采用不同的请求标头(Accept、Connection、Cache-Control 等),但 produces 元素仅与 Accept 请求标头和consumes 元素只关心Content-Type 请求头。