我有一个用 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,但如果我在单个方法中指定两个 mediaType(如提供的示例),则它不起作用。
我想要的是调用 \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;
}
原文由 Smajl 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以在博客文章 @RequestMapping with Produces and Consumes 中的第 6 点找到一些提示。
注意有关 Content-Type 和 Accept 标头的部分:
您也可以尝试 这种 不同的方法(使用 ResponseEntity 对象),它允许您找出传入的消息类型并生成相应的消息(也利用 @ResponseBody 注释)