【WEB 系列】xml 传参与返回使用姿势
使用 XML 作为传参和返回结果,在实际的编码中可能不太常见,特别是当前 json 大行其道的时候;那么为什么突然来这么一出呢?源于对接微信公众号的消息接收,自动回复的开发时,惊奇的发现微信使用 xml 格式进行交互,所以也就不得不支持了
下面介绍一下 SpringBoot 中如何支持 xml 传参解析与返回 xml 文档
<!-- more -->
本文创建的实例工程采用SpringBoot 2.2.1.RELEASE
+ maven 3.5.3
+ idea
进行开发
具体的 SpringBoot 项目工程创建就不赘述了,对于 pom 文件中,需要重点关注下面两个依赖类
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.10.0</version>
</dependency>
</dependencies>
请注意 jackson-dataformat-xml 版本,不要选择太老的
定义一个接受参数的 bean 对象,如下
@JacksonXmlRootElement(localName = "req")
@Data
public static class XmlBean {
private String name;
@JacksonXmlProperty(localName = "age")
private Integer age;
}
请注意,我们使用@JacksonXmlRootElement
注解来修饰这个 bean,localName 中的 value,相当于 xml 的根标签;如果类中的属性成员名,和 xml 标签名不一样,可以使用注解@JacksonXmlProperty(localName = "xxx")
来修饰
其次,请保留 bean 的默认无参构造函数,get/set 方法 (我上面为了简洁,使用了 lombok(最近看到了不少抨击 lombok 的文章...),不希望使用 lombok 的小伙伴,可以利用 IDEA 的自动生成,来实现相关的代码)
定义返回的也是一个 xml bean
@Data
@JacksonXmlRootElement(localName = "res")
public static class XmlRes {
private String msg;
private Integer code;
private String data;
}
然后像平常一样,实现一个"普通"的 rest 服务即可
@RestController
@RequestMapping(path = "xml")
public class XmlParamsRest {
@PostMapping(path = "show", consumes = {MediaType.APPLICATION_XML_VALUE},
produces = MediaType.APPLICATION_XML_VALUE)
public XmlRes show(@RequestBody XmlBean bean) {
System.out.println(bean);
XmlRes res = new XmlRes();
res.setCode(0);
res.setMsg("success");
res.setData(bean.toString());
return res;
}
}
注意三点
@RestController
:返回的不是视图@PostMapping
注解中的 consumes
和 produces
参数,指定了"application/xml",表示我们接收和返回的都是 xml 文档@RequestBody
:不加这个注解时,无法获取传参哦(可以想一想 why?)接口测试
我个人倾向于万能的 curl 进行测试,打开终端即可使用,如下
# 测试命令
curl -X POST 'http://127.0.0.1:8080/xml/show' -H 'content-type:application/xml' -d '<req><name>一灰灰</name><age>18</age></req>' -i
考虑到有些小伙伴更青睐于 Postman 进行 url 测试,下面是具体的请求姿势
如果需要重新这个问题,可以参考项目: https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-boot/202-web-params
某些场景下,直接使用上面的姿势貌似不能正常工作,会抛出一个Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/xml;charset=UTF-8' not supported]
的异常信息
针对出现HttpMediaTypeNotSupportedException
的场景,解决办法也很明确,增加一个 xml 的HttpMesssageConverter
即可,依然是借助MappingJackson2XmlHttpMessageConverter
,如
@Configuration
public class MvcConfig extends WebMvcConfigurationSupport {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
converters.add(new MappingJackson2XmlHttpMessageConverter());
}
}
尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现 bug 或者有更好的建议,欢迎批评指正,不吝感激
下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。