【发布时间】:2016-01-05 17:29:50
【问题描述】:
我在 Spring-boot 应用程序中编写了一个简单的 REST 控制器,但我不确定如何实现内容协商以使其根据请求标头中的 Content-Type 参数返回 JSON 或 XML。有人可以向我解释一下,我做错了什么吗?
控制器方法:
@RequestMapping(value = "/message", method = RequestMethod.GET, produces = { MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE })
public Message getMessageXML(@RequestParam("text") String text) throws Exception {
Message message = new Message();
message.setDate(new Date());
message.setName("Test");
message.setAge(99);
message.setMessage(text);
return message;
}
调用此方法时我总是得到 JSON(即使我将 Content-Type 指定为 application/xml 或 text/xml)。
当我实现两个方法时,每个方法都有不同的映射和不同的内容类型,我可以从 xml 中获取 XML,但是如果我在一个方法中指定两个 mediaTypes(如提供的示例),它将不起作用。
我想要的是调用\message 端点并接收
- 当 GET 请求的 Content-Type 设置为 application/xml 时的 XML
- Content-Type 为 application/json 时的 JSON
感谢任何帮助。
编辑: 我更新了我的控制器以接受所有媒体类型
@RequestMapping(value = "/message", method = RequestMethod.GET, produces = { MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE }, consumes = MediaType.ALL_VALUE)
public Message getMessageXML(@RequestParam("text") String text) throws Exception {
Message message = new Message();
message.setDate(new Date());
message.setName("Vladimir");
message.setAge(35);
message.setMessage(text);
return message;
}
【问题讨论】:
-
您需要提供
Accept标头,其值为application/xml或任何受支持的媒体类型。 -
“Content-Type”标头定义了您发送的内容类型 - 而不是您想要接收的内容(这就是“Accept”标头的用途。所以使用“Content-Type” GET请求的标头没有意义,因为不能有任何(正文)内容。因此,在您的情况下,您应该为您的请求使用“Accept”标头,并在响应中使用“Content-Type”标头来命名实际发送的内容类型。
标签: java rest spring-boot