使用Freemarker生成XML报文

胡萝虎 

 

最近项目需要跟一家供应商对接系统,对方的接口支持Webservice协议和HTTP协议,总之都是使用XML传输报文。现在API接口一般使用Json比较多,使用XML的还是比较少见的。好多年没搞XML序列化和反序列相关代码了,jdom、dom4j、xpath等等好多年没用过了,贸然用起来还有点不放心,干脆搞些不一样的!

 

FreeMarker

FreeMarker

FreeMaker一般是作为前端模版引擎来使用的,使用FTL指令,可以在页面上生成动态内容。利用这个特性,我们也可以使用它完成填充XML中的占位符参数,实现动态生成XML报文,简单说就是模版+数据=动态结果。下面上代码:

  • 添加FreeMarker依赖,我们使用最新的版本 2.3.30
 <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.30</version>
</dependency>

 

  • 在项目resources下创建一个ftl文件(test.ftl),内容如下。其中${}是参数占位符
<Request service="TEST_SERVICE" lang="zh-CN">
    <Boms>
        <Bom>
            <SkuNo>${mainSku}</SkuNo>
            <Items>
                <#list subList as sku >
                    <Item>
                        <Sequence>${sku.sequence}</Sequence>
                        <SkuNo>${sku.barcode}</SkuNo>
                        <Quantity>${sku.quantity}</Quantity>
                    </Item>
                </#list>
            </Items>
        </Bom>
    </Boms>
</Request>

 

  • 读取xml文件内容,并动态填充占位符
//读取xml文件为字符串(工具类就是普通的java文件读取操作) 
String xmlStr = FreeMarkUtils.getOrLoadFtl("/test.ftl");

//创建2个对象
SFBomSubSku subSku1 = SFBomSubSku.builder()
                .barcode("10000010")
                .quantity("1")
                .sequence("1")
                .build();
SFBomSubSku subSku2 = SFBomSubSku.builder()
                .barcode("10000011")
                .quantity("3")
                .sequence("2")
                .build();

List<SFBomSubSku> list = Lists.newArrayList(subSku1, subSku2);

//设置参数值
Map<String, Object> args = new HashMap<>();
args.put("mainSku", "111111");
args.put("subList", list);


//配置FreeMarker
Configuration cfg = new Configuration(Configuration.VERSION_2_3_30);
cfg.setDefaultEncoding("UTF-8");
cfg.setNumberFormat("computer");

//动态填充参数
Template template = new Template("", source, cfg);
StringWriter out = new StringWriter();
template.process(dataModel, out);

//获取填充后的xml字符串,完成
String data = out.toString();
System.out.println(data)

 

  • 运行上面的代码,打印出以下内容,可以看到xml中的占位符被参数正确替换掉了。
<Request service="TEST_SERVICE" lang="zh-CN">
    <Boms>
        <Bom>
            <SkuNo>111111</SkuNo>
            <Items>
                    <Item>
                        <Sequence>1</Sequence>
                        <SkuNo>10000010</SkuNo>
                        <Quantity>1</Quantity>
                    </Item>
                    <Item>
                        <Sequence>2</Sequence>
                        <SkuNo>10000011</SkuNo>
                        <Quantity>3</Quantity>
                    </Item>
            </Items>
        </Bom>
    </Boms>
</Request>

 

使用

通过上面的介绍可以看到,使用FreeMarker动态替换XML中的参数占位符,可以省去手工拼XML或使用对象序列化带来的麻烦,只需要在项目中创建一个ftl文件,通过工具类快递完成XML报文的生成,然后通过HttpClient发送请求即可

ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, data, String.class);

 

Recommended Posts

Jellyfin中使用QSV替代VAAPI转码

使用过Jellyfin的应该都会遇到转码的问题,默认情况下都是使用VAAPI进行转码,这种方式兼容性比较好,但是转码的性能比较一般。如果使用的是Intel平台J4125及更早的CPU的话,建议切换为QSV(Intel Quick Sync )进行转码,效率会比VAAPI快很多,并且CPU也会更低。

胡萝虎 

在群晖上使用Docker部署为知笔记服务

虽然市面上有很多各种类型的云笔记应用,像有道云笔记、印象、OneNote,包括Notion,博主都曾尝试使用过。但是随着资料越来越多,特别是一些涉及个人隐私的资料放在云端笔记上,比如密码、账号之类的,让博主越来越感到焦虑😂。博主此前也曾在群晖部署过蚂蚁笔记,但是使用感受实在不咋滴;一段时间以来,只能勉强用群晖自带的弱智Note Station来记录个人资料,真怕哪天自己也搞弱智了。

最近实在受不了Note Station的反人类操作了,不得不再次开启寻找解决方案的征途,幸运的是,Eureka…… 为知笔记的私有化方案终于让我解放啦

胡萝虎 

在群晖中搭建Cloudreve网盘系统

众所周知,某度网盘为了挣钱,各种极限限速,下载限速能把人恶心死。但是,网盘类服务越来越成为人们的刚需,不管是个人生活中的照片,还是工作学习中各类资料,相信很多人都需要使用到网盘进行存储和分享。如果你不想忍受某度的速度,建议有条件的朋友可以试试自己搭建一套网盘系统,本文以Cloudreve为例,在群晖NAS上搭建一套属于自己的私人网盘服务,供读者们参考

胡萝虎 

在群晖上搭建Bitwarden密码管理服务器

管理密码是很多人头痛的事,密码设置简单好记又不太安全,设置复杂又容易忘。为了解决这个难题,市面上出现了不少密码管理工具,帮助人们管理在各种平台、系统、网站、APP上设置的密码,比如1Password、Lastpass、KeePass等,不过绝大多数需要付费才能使用。本着能白嫖就绝不花一个子儿的原则,今天我就来介绍一个不需要花钱的密码管理器——Bitwarden

胡萝虎 

使用Docker一键安装服务端神器Appwrite

Appwrite是一个基于Docker的开源的端到端开发者平台,其容器化的微服务库可应用于网页端,移动端,以及后端。Appwrite 通过视觉化界面极简了从零编写 API 的繁琐过程,在保证软件安全的前提下为开发者创造了一个高效的开发环境。

简单来说,如果你只会前端开发,不懂后端技术,那么这个神器就可以帮你轻松完成后端服务搭建,包括账户、用户、团队、数据库、存储、云函数等等,目前支持各类前端平台,包括Flutter、Vue、Angular、React、iOS和Android等

胡萝虎 

Leave A Comment