xml格式报文的拼装,和解析成实体类
我们的微信支付,使用的是第三方的支付,某银行的微信支持渠道。所有的接口请求、应答都是xml格式报文,这样就需要用到xml格式报文的拼装和解析,这儿简单讲一下。
拼接xml格式报文。
从页面表单提交和配置文件中读取出参数,或用实体类接收的页面传来的参数。建立map对象,用put()方法把参数添加进去。然后遍历map,将map转换成xml。
-
StringBuffer soapResultData = new StringBuffer();
-
//xml声明
-
soapResultData.append("<?xml version=\"1.0\" encoding=\"GBK\"?><ROOT><MSG_HEAD>");
-
//请求头
-
soapResultData.append(requesttoxml(msgHead));
-
soapResultData.append("</MSG_HEAD><MSG_BODY>");
-
//请求体
-
soapResultData.append(requesttoxml(resmap));
-
soapResultData.append("</MSG_BODY></ROOT>");
-
/**
-
* 将map转化为XML格式的字符串
-
* @param resmap
-
* @return
-
*/
-
public static String requesttoxml(Map<String, String> resmap){
-
StringBuffer soapResultData = new StringBuffer();
-
for(String key : resmap.keySet()){
-
soapResultData.append("<");
-
soapResultData.append(key);
-
soapResultData.append(">");
-
soapResultData.append(resmap.get(key));
-
soapResultData.append("</");
-
soapResultData.append(key);
-
soapResultData.append(">");
-
}
-
return soapResultData.toString();
-
}
将接收到的xml格式报文,转换成实体类。
-
package com.ustcsoft.business.model;
-
-
import java.io.Serializable;
-
-
import org.apache.commons.digester3.annotations.rules.BeanPropertySetter;
-
import org.apache.commons.digester3.annotations.rules.ObjectCreate;
-
-
@ObjectCreate(pattern = "ROOT/MSG_HEAD")
-
public class ResponseMsgHead implements Serializable {
-
/**
-
*
-
*/
-
private static final long serialVersionUID = -2793215313546940251L;
-
@BeanPropertySetter(pattern = "ROOT/MSG_HEAD/TRAN_CODE")
-
private String TRAN_CODE;
-
@BeanPropertySetter(pattern = "ROOT/MSG_HEAD/PARTNER_CODE")
-
private String PARTNER_CODE;
-
@BeanPropertySetter(pattern = "ROOT/MSG_HEAD/REQUEST_SERIAL")
-
private String REQUEST_SERIAL;
-
@BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESPONSE_DATE")
-
private String RESPONSE_DATE;
-
@BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESPONSE_TIMESTAMP")
-
private String RESPONSE_TIMESTAMP;
-
@BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESULT_CODE")
-
private String RESULT_CODE;
-
@BeanPropertySetter(pattern = "ROOT/MSG_HEAD/RESULT_MESSAGE")
-
private String RESULT_MESSAGE;
-
//get set 省略,不贴在这儿,自己使用时别忘了生成个set和get方法
-
}
-
import static org.apache.commons.digester3.binder.DigesterLoader.newLoader;
-
-
import java.io.StringReader;
-
import java.text.SimpleDateFormat;
-
import java.util.HashMap;
-
import java.util.Map;
-
import java.util.TreeMap;
-
-
import org.apache.commons.digester3.Digester;
-
import org.apache.commons.digester3.annotations.FromAnnotationsRuleModule;
-
import org.apache.log4j.Logger;
-
-
import com.ustcsoft.business.model.CreditPayResponseBody;;
-
import com.ustcsoft.business.model.ResponseMsgHead;
-
import com.ustcsoft.framework.util.HTTPUtil;
-
import com.ustcsoft.framework.util.XMlUtil;
-
-
public class PayService {
-
private final Map<Class<?>, FromAnnotationsRuleModule> xmlAnnotationModule = new HashMap<Class<?>, FromAnnotationsRuleModule>();
-
private static final Logger logger=Logger.getLogger(PayService.class);
-
-
public PayService() {
-
xmlAnnotationModule.put(ResponseMsgHead.class,
-
new FromAnnotationsRuleModule() {
-
@Override
-
protected void configureRules() {
-
bindRulesFrom(ResponseMsgHead.class);
-
}
-
});
-
xmlAnnotationModule.put(CreditPayResponseBody.class,
-
new FromAnnotationsRuleModule() {
-
@Override
-
protected void configureRules() {
-
bindRulesFrom(CreditPayResponseBody.class);
-
}
-
});
-
}
-
-
//中间业务代码省略……
-
-
public <T> T parseXml(String xml, Class<T> clazz) throws Exception {
-
StringReader sr = null;
-
try {
-
Digester digester = newLoader(xmlAnnotationModule.get(clazz)).newDigester();
-
sr = new StringReader(xml);
-
T pi = digester.parse(sr);
-
digester.clear();
-
return pi;
-
} finally {
-
if (sr != null) {
-
sr.close();
-
}
-
}
-
}
-
}
-
logger.info("统一下单接口请求报文:"+requestxml);
-
String resultxml = HTTPUtil.postByHttps(url, requestxml,"GBK");
-
logger.info("统一下单接口返回报文:"+resultxml);
-
if(resultxml != null){
-
resultxml = XMlUtil.xmltoUpperCase(resultxml);//将XML报文中的标签,全部转化为大写
-
ResponseMsgHead head = parseXml(resultxml, ResponseMsgHead.class);
-
CreditPayResponseBody body = parseXml(resultxml, CreditPayResponseBody.class);
-
if (null != head) {
-
if(head.getRESULT_CODE().equals("000000")){
-
logger.info("下单成功");
-
logger.info("返回参数:sub_mch_id="+body.getSUB_MCH_ID()+",total_fee="+body.getTOTAL_FEE()+",out_trade_no="+body.getOUT_TRADE_NO());
-
return body;
-
}else{
-
logger.info("下单失败,错误码:"+head.getRESULT_CODE()+",错误信息:"+head.getRESULT_MESSAGE());
-
}
-
}
-
}
-
/**
-
* 将XML报文中的标签,全部转化为大写
-
* @param xmlMessage
-
* @return
-
*/
-
public static String xmltoUpperCase(String xmlMessage) {
-
Pattern pattern = Pattern.compile("<.+?>");
-
String xml = xmlMessage.split(">")[0];
-
String xml0 = xmlMessage.substring(0, xml.length()+1);
-
String xml1 = xmlMessage.substring(xml.length()+1);
-
StringBuilder res = new StringBuilder();
-
int lastIdx = 0;
-
Matcher matchr = pattern.matcher(xml1);
-
while (matchr.find()) {
-
String str = matchr.group();
-
res.append(xml1.substring(lastIdx, matchr.start()));
-
res.append(str.toUpperCase());
-
lastIdx = matchr.end();
-
}
-
res.append(xml1.substring(lastIdx));
-
String result = xml0 + res.toString();
-
return result;
-
}
以上就是拼接xml格式报文和解析xml格式报文。需要注意的是,在解析xml格式报文时,由于对方返回的报文的标签有小写的,结果解析出错,所以在里面做了个处理,将标签全部转化为大写。
xml格式报文的拼装,和解析成实体类的更多相关文章
- 自动将String类型的XML解析成实体类
package com.mooc.freemarker2dto; public class BaseDto { } package com.mooc.freemarker2dto; public cl ...
- IntelliJ IDEA 通过GsonFormat插件将JSONObject格式的String 解析成实体
GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高. 插件地址:https://plugins.jetbr ...
- GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高。
GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高. 插件地址:https://plugins.jetbr ...
- IDEAL葵花宝典:java代码开发规范插件:GsonFormat插件将JSONObject格式的String 解析成实体
前言: GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高. 这个教程主要是学习IntelliJ IDEA ...
- Mybaits 源码解析 (八)----- 全网最详细,没有之一:结果集 ResultSet 自动映射成实体类对象(上篇)
上一篇文章我们已经将SQL发送到了数据库,并返回了ResultSet,接下来就是将结果集 ResultSet 自动映射成实体类对象.这样使用者就无需再手动操作结果集,并将数据填充到实体类对象中.这可大 ...
- WebApi系列~FromUri参数自动解析成实体的要求
回到目录 关于webapi我之前写了一些文章,大家可以根据目录去浏览,今天要说的是个怪问题,也是被我忽略的一个问题,当你的Url参数需要被Api自动解析成实体的属性,实事上是要有条件的,不是所以属性都 ...
- 复杂xml格式报文和实体类之间的转化
pom.xml中引入如下依赖: <dependency> <groupId>org.eclipse.persistence</groupId> <artifa ...
- ajax交互数据简单拼装,数组成字符串
json2Form:function(json) { var str = ""; for(var p in json){ // 判断对象是否为数组 if(typeof json[p ...
- SpringCloud中接收application/json格式的post请求参数并转化为实体类
@CrossOrigin(allowCredentials="true", allowedHeaders="*", methods={RequestMethod ...
随机推荐
- bzoj2763 [JLOI]飞行路线 分层图最短路
问题描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的 ...
- Spring EL表达式和资源调用
Spring EL表达式 Spring EL-Spring表达式语言,支持在xml和注解中使用表达式,类似于在jsp的EL表达式语言. Spring 开发中经常涉及调用各种资源的情况, ...
- CSU 1378 Shipura 简单模拟
上周末中南的题,当时就知道是个简单模拟题,可是一个多小时就是没写出来,代码能力啊 >.< 题意: 某人发明了一种程序语言,只支持一种运算">>",和一种函数 ...
- 【BZOJ 1051】[HAOI2006]受欢迎的牛
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] Tarjan算法强连通缩点 . 最后出度为0的点. 如果只有一个. 那么这个"大点"所包含的点的个数就是答案了. ...
- Service绑定模式
Service绑定模式 使用绑定的Service能够实现组件与Service的通信. 组件与被绑定的Service能够不归属于同一个应用程序.因此通过绑定Service能够实现进程间通信. ...
- javascript进阶课程--第一章--函数
javascript进阶课程--第一章--函数 学习要点 了解内存管理 掌握全局函数的使用 知识点 基本类型和引用类型 基本类型值有:undefined,NUll,Boolean,Number和Str ...
- Integer 和 int的种种比较
public static void main(String[] args) { int i = 128; Integer i2 = 128; Integer i3 = new Integer(128 ...
- Ionic2集成ngx-datatable,ng2-tree第三方控件.md
1. 基本环境配置 1.1. 命令安装相应的依赖 1.2. 在Module定义中引入对应Module 1.3. 引入对应的CSS 2. 简单使用示例验证是否集成成功 2.1. ngx-datatabl ...
- ajax处理错误(六)
使用ajax时必须留心两类错误,他们之间的区别源于视角不同. 一.第一类错误是从XMLHttpRequest对象的角度看到的问题:某些因素阻例如止了请求发送到服务器,例如DNS无法解析主机名,连接请求 ...
- Linux常用浏览器
1.火狐浏览器是一个安全高效的浏览器,它具有速度快.隐私保护.丰富的插件资源.不同设备之间同步数据.分页浏览.个性化定制等特性. 2.谷歌浏览器 谷歌浏览器是一个由Google公司开发的网页浏览器,具 ...