您的位置:首页 > 其它

servlet获取并解析post请求发送过来的xml字符串

2017-04-07 16:58 393 查看
客户端代码:

@Action(value = "/sendxmlTest", results = {
@Result(name = SUCCESS, location = "condo/accountOpenApplly.jsp"),
@Result(name = INPUT, location = "base/error.jsp") })
public String sendxmlTest(){
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<request>\n" +
"  <head>\n" +
"    <transType>0101</transType>\n" +
"    <terminalVer>1.0.0</terminalVer>\n" +
"    <dateTime>20170407103000</dateTime>\n" +
"  </head>\n" +
"  <body>\n" +
"    <contactNo>Test00001</contactNo>\n" +
"  </body>\n" +
"<mac>902de37505fce863f4489a87c7e3fa6c</mac>"+
"</request>";

String url = "http://127.0.0.1:8080/zxemm/contactServlet.htm";
try {
String resultXml = SubmitUtils.buildRequest(url, xml);
} catch (Exception e) {
e.printStackTrace();
}
return SUCCESS;

}


服务端代码:

package com.jiuyi.net.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import com.jiuyi.jyplat.entity.condo.ContactInfo;
import com.jiuyi.jyplat.service.SpringContextUtil;
import com.jiuyi.jyplat.service.condo.IContactInfoService;
import com.jiuyi.jyplat.util.ConfigManager;
import com.jiuyi.jyplat.util.DateUtils;
import com.jiuyi.jyplat.util.Utils;
import com.jiuyi.net.message.httpClient.XMLUtil;
import com.jiuyi.net.message.pos.contact.QurContactRsp;
import com.jiuyi.net.message.pos.contact.QurContactRspMsg;
import com.jiuyi.net.message.pos.contact.RequestHead;
import com.jiuyi.net.utils.PosMacUtils;

/**
*
* <p><b>Title: </b>ContactServlet.java
* <p><b>Description: </b>合同信息查询servlet
* @author
* @version V1.0
* <p>
* 2017-4-6  创建类  <br>
*
*/
public class ContactServlet extends HttpServlet{

private static final long serialVersionUID = 1L;

Logger log = Logger.getLogger(ContactServlet.class);

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
log.info("收到查询合同信息的请求...");
QurContactRspMsg rspMsg = new QurContactRspMsg();
QurContactRsp rsp = new QurContactRsp();
RequestHead head = new RequestHead();
head.setTransType("0101");
head.setTerminalVer("V1.0");
head.setDateTime(DateUtils.getToday(DateUtils.TIME_STR_FORMAT));
PrintWriter out = response.getWriter();
ServletInputStream sis = null;
String xmlData="";
Map<String,String> macMap = new HashMap<String,String>();
String posKey = (String) ConfigManager.getInstance().getConfigItem("pos_key", ""); //获取配置文件中的加密key
try {
//编码格式改成UTF-8
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
response.setContentType("textml; charset=UTF-8");
response.setHeader("Content-type", "text/html;charset=UTF-8");

sis=request.getInputStream();
// 取HTTP请求流长度
int size = request.getContentLength();
// 用于缓存每次读取的数据
byte[] buffer = new byte[size];
// 用于存放结果的数组
byte[] xmldataByte = new byte[size];
int count = 0;
int rbyte = 0;
// 循环读取
while (count < size) {
// 每次实际读取长度存于rbyte中
rbyte = sis.read(buffer);
for(int i=0;i<rbyte;i++) {
xmldataByte[count + i] = buffer[i];
}
count += rbyte;
}

xmlData = new String(xmldataByte, "UTF-8");
log.info("查询合同信息接口接收的xmlData为:"+xmlData);

//将传入的xml字符串转换为map集合
Map<String,String> params = new HashMap<String,String>();
params = this.parseXmlToMap(xmlData);

//验签
String posSign = genMac(xmlData); //得到请求报文的密文
String mySign = PosMacUtils.buildRequestMysign(params,posKey);
if(Utils.isNullData(posSign,mySign) || !posSign.equals(mySign)){
log.error("调用保存pos机交易流水接口验签失败!");
head.setResponseCode("0001");
head.setResponseDesc("验签失败");
rspMsg.setHead(head);
String xmlRsp = XMLUtil.objToxml(rspMsg);
xmlRsp = XMLUtil.formatXml(xmlRsp);

macMap = this.parseXmlToMap(xmlRsp); //将xml报文转换成map集合用于生成密文
String mac = PosMacUtils.buildRequestMysign(macMap, posKey);
rspMsg.setMac(mac);
String resultXml = XMLUtil.objToxml(rspMsg);
resultXml = XMLUtil.formatXml(resultXml);
log.info("调用保存pos机交易流水接口返回报文为:"+resultXml);
out.print(resultXml);
out.flush();
out.close();
return;
}

//获取请求参数中的合同号
String contactNo = params.get("contactNo");
String transType = params.get("transType");
if(Utils.isNullData(contactNo,transType)){
log.error("调用查询合同信息接口请求参数不完整,请检查!");
head.setResponseCode("0011");
head.setResponseDesc("请求参数不完整");
rspMsg.setHead(head);
String xmlRsp = XMLUtil.objToxml(rspMsg);
xmlRsp = XMLUtil.formatXml(xmlRsp);

macMap = this.parseXmlToMap(xmlRsp); //将xml报文转换成map集合用于生成密文
String mac = PosMacUtils.buildRequestMysign(macMap, posKey);
rspMsg.setMac(mac);
String resultXml = XMLUtil.objToxml(rspMsg);
resultXml = XMLUtil.formatXml(resultXml);
log.info("调用保存pos机交易流水接口返回报文为:"+resultXml);
out.print(resultXml);
out.flush();
out.close();
return;
}
IContactInfoService contactInfoService = (IContactInfoService)SpringContextUtil.getBean("contactInfoService");
ContactInfo c = contactInfoService.findByContactNo(contactNo);
if(null==c){
head.setResponseCode("0001");
head.setResponseDesc("查询合同信息不存在");
rspMsg.setHead(head);
String xmlRsp = XMLUtil.objToxml(rspMsg);
xmlRsp = XMLUtil.formatXml(xmlRsp);

macMap = this.parseXmlToMap(xmlRsp); //将xml报文转换成map集合用于生成密文
String mac = PosMacUtils.buildRequestMysign(macMap, posKey);
rspMsg.setMac(mac);
String resultXml = XMLUtil.objToxml(rspMsg);
resultXml = XMLUtil.formatXml(resultXml);
log.info("调用保存pos机交易流水接口返回报文为:"+resultXml);
out.print(resultXml);
out.flush();
out.close();
return;
}
if(null!=c && "1111".equals(c.getStatus())){//合同已撤销
head.setResponseCode("0004");
head.setResponseDesc("退款中(合同已撤销)");
rspMsg.setHead(head);
String xmlRsp = XMLUtil.objToxml(rspMsg);
xmlRsp = XMLUtil.formatXml(xmlRsp);

macMap = this.parseXmlToMap(xmlRsp); //将xml报文转换成map集合用于生成密文
String mac = PosMacUtils.buildRequestMysign(macMap, posKey);
rspMsg.setMac(mac);
String resultXml = XMLUtil.objToxml(rspMsg);
resultXml = XMLUtil.forma
4000
tXml(resultXml);
log.info("调用保存pos机交易流水接口返回报文为:"+resultXml);
out.print(resultXml);
out.flush();
out.close();
return;
}
if(null!=c && "2222".equals(c.getStatus())){//无效合同
head.setResponseCode("0010");
head.setResponseDesc("无效合同");
rspMsg.setHead(head);
String xmlRsp = XMLUtil.objToxml(rspMsg);
xmlRsp = XMLUtil.formatXml(xmlRsp);

macMap = this.parseXmlToMap(xmlRsp); //将xml报文转换成map集合用于生成密文
String mac = PosMacUtils.buildRequestMysign(macMap, posKey);
rspMsg.setMac(mac);
String resultXml = XMLUtil.objToxml(rspMsg);
resultXml = XMLUtil.formatXml(resultXml);
log.info("调用保存pos机交易流水接口返回报文为:"+resultXml);
out.print(resultXml);
out.flush();
out.close();
return;
}
rsp.setBackCardName(c.getBackCardName());
rsp.setBankCode(c.getBackCardNo());
rsp.setCompanyName(c.getCompanyName());
rsp.setContactAmt(null==c.getContactAmt()?0.0:Double.parseDouble(c.getContactAmt()));
rsp.setContactNo(c.getContactNo());
rsp.setCreateDate(c.getCreateDate());
rsp.setHouseAddr(c.getHouseAddr());
rsp.setHouseArea(null==c.getHouseArea()?0.0:Double.parseDouble(c.getHouseArea()));
rsp.setHouseNo(c.getHouseNo());
rsp.setOperNo(c.getOperNo());
rsp.setPayCont(null==c.getPayCont()?0.0:Double.parseDouble(c.getPayCont()));
rsp.setPaymentCode(c.getPaymentCode());
rsp.setProjectName(c.getProjectName());
rsp.setProjectNo(c.getProjectNo());
rsp.setRoomNo(c.getRoomNo());
rsp.setSuperviseAmt(null==c.getSuperviseAmt()?0.0:Double.parseDouble(c.getSuperviseAmt()));
rsp.setUnitNo(c.getUnitNo());
head.setResponseCode("0000");
head.setResponseDesc("交易成功");
rspMsg.setHead(head);
rspMsg.setBody(rsp);
String xmlRsp = XMLUtil.objToxml(rspMsg);
xmlRsp = XMLUtil.formatXml(xmlRsp);

macMap = this.parseXmlToMap(xmlRsp); //将xml报文转换成map集合用于生成密文
String mac = PosMacUtils.buildRequestMysign(macMap, posKey);
rspMsg.setMac(mac);
String resultXml = XMLUtil.objToxml(rspMsg);
resultXml = XMLUtil.formatXml(resultXml);
log.info("调用保存pos机交易流水接口返回报文为:"+resultXml);
out.print(resultXml);
out.flush();
out.close();
return;

} catch (Exception e) {
log.error("调用保存pos机交易流水接口出现异常!"+e.toString(), e);
String returnXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
returnXml+="<response><head><dateTime>"+DateUtils.getToday(DateUtils.TIME_STR_FORMAT)+"</dateTime>";
returnXml+=" <responseCode>9999</responseCode><responseDesc>系统异常</responseDesc><terminalVer>V1.0</terminalVer><transType>0101</transType></head></response>";
macMap = this.parseXmlToMap(returnXml); //将xml报文转换成map集合用于生成密文
String mac = PosMacUtils.buildRequestMysign(macMap, posKey);
String resultXml ="<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
resultXml += "<response><head><dateTime>"+DateUtils.getToday(DateUtils.TIME_STR_FORMAT)+"</dateTime>";
resultXml+=" <responseCode>9999</responseCode><responseDesc>系统异常</responseDesc><terminalVer>V1.0</terminalVer><transType>0101</transType></head><mac>"+mac+"</mac></response>";
log.info("调用保存pos机交易流水接口返回报文为:"+resultXml);
out.print(resultXml);
out.flush();
out.close();
return;
}

}

/**
*
* <p><b>Description: </b>得到发送过来的密文
* <p>2017-4-7 下午12:34:45
* @author
* @param xml
* @return
*/
public static String genMac(String xml){
try {
Document doc = null;
// 将字符串转为XML
doc = DocumentHelper.parseText(xml);
// 获取根节点
Element rootElt = doc.getRootElement();

String mac =  rootElt.elementTextTrim("mac");
return mac;
} catch (DocumentException e) {
e.printStackTrace();
}
return null;
}

/**
*
* <p><b>Description: </b>解析查询合同信息接口的请求报文
* <p>2017-4-7 上午10:27:02
* @author
* @param xml
* @return
*/
public static Map parseXmlToMap(String xml) {
Map map = new HashMap();
Document doc = null;
try {
// 将字符串转为XML
doc = DocumentHelper.parseText(xml);
// 获取根节点
Element rootElt = doc.getRootElement();
// 获取根节点下的子节点head
Iterator iter = rootElt.elementIterator("head");
// 遍历head节点
while (iter.hasNext()) {

Element recordEle = (Element) iter.next();
// 拿到head节点下的子节点transType值
String transType = recordEle.elementTextTrim("transType");
map.put("transType", transType);
// 拿到head节点下的子节点terminalVer值
String terminalVer = recordEle.elementTextTrim("terminalVer");
map.put("terminalVer", terminalVer);
// 拿到head节点下的子节点dateTime值
String dateTime = recordEle.elementTextTrim("dateTime");
map.put("dateTime", dateTime);

// 拿到head节点下的子节点responseCode值
String responseCode = recordEle.elementTextTrim("responseCode");
map.put("responseCode", responseCode);
// 拿到head节点下的子节点responseDesc值
String responseDesc = recordEle.elementTextTrim("responseDesc");
map.put("responseDesc", responseDesc);
}

//获取根节点下的子节点body
Iterator iterss = rootElt.elementIterator("body");
// 遍历body节点
while (iterss.hasNext()) {
Element recordEless = (Element) iterss.next();
// 拿到body节点下的子节点contactNo值
String contactNo = recordEless.elementTextTrim("contactNo");
map.put("contactNo", contactNo);

String contactAmt = recordEless.elementTextTrim("contactAmt");
map.put("contactAmt", contactAmt);

String superviseAmt = recordEless.elementTextTrim("superviseAmt");
map.put("superviseAmt", superviseAmt);

String houseNo = recordEless.elementTextTrim("houseNo");
map.put("houseNo", houseNo);

String houseArea = recordEless.elementTextTrim("houseArea");
map.put("houseArea", houseArea);

String houseAddr = recordEless.elementTextTrim("houseAddr");
map.put("houseAddr", houseAddr);

String backCardName = recordEless.elementTextTrim("backCardName");
map.put("backCardName", backCardName);

String roomNo = recordEless.elementTextTrim("roomNo");
map.put("roomNo", roomNo);

String bankCode = recordEless.elementTextTrim("bankCode");
map.put("bankCode", bankCode);

String unitNo = recordEless.elementTextTrim("unitNo");
map.put("unitNo", unitNo);

String projectName = recordEless.elementTextTrim("projectName");
map.put("projectName", projectName);

String projectNo = recordEless.elementTextTrim("projectNo");
map.put("projectNo", projectNo);

String companyName = recordEless.elementTextTrim("companyName");
map.put("companyName", companyName);

String createDate = recordEless.elementTextTrim("createDate");
map.put("createDate", createDate);

String paymentCode = recordEless.elementTextTrim("paymentCode");
map.put("paymentCode", paymentCode);

String payCont = recordEless.elementTextTrim("payCont");
map.put("payCont", payCont);

String operNo = recordEless.elementTextTrim("operNo");
map.put("operNo", operNo);

}
} catch (DocumentException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
}
发送xml格式字符串请求报文的代码

package com.jiuyi.net.utils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class SubmitUtils {

/**
* 建立请求,以模拟远程HTTP的POST请求
* @param urlStr 请求地址
* @param xmlInfo 请求的xml内容
* @return 返回请求内容 xml字符串
* @throws Exception
*/
public static String buildRequest(String urlStr,String xmlInfo) throws Exception {
String strResult = "";
HttpURLConnection httpConn = null;
BufferedReader bufReader = null;
InputStreamReader input = null;

try {
URL url = new URL(urlStr);
httpConn = (HttpURLConnection) url.openConnection();
httpConn.setFollowRedirects(true);
httpConn.setDoOutput(true); // 需要向服务器写数据
httpConn.setDoInput(true); //
httpConn.setUseCaches(false); // 获得服务器最新的信息
httpConn.setAllowUserInteraction(false);
httpConn.setRequestMethod("POST");
httpConn.addRequestProperty("accept", "text/xml;text/html");
httpConn.addRequestProperty("Content-Type",  "text/xml;charset=utf-8");
httpConn.addRequestProperty("Accept","image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/x-silverlight, */*");
httpConn.setRequestProperty("Referer","http://passport.examda.com/?login&tpl=mn&u=http%3A//www.examda.com/");
httpConn.setRequestProperty("Accept-Language", "zh-cn");
httpConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
httpConn.setRequestProperty("Accept-Encoding","gzip, deflate");
httpConn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Foxy/1; .NET CLR 2.0.50727;MEGAUPLOAD 1.0)");
httpConn.setRequestProperty("Host", "passport.examda.com");
httpConn.setRequestProperty("Content-Length", xmlInfo.length()+ "");

OutputStream out = httpConn.getOutputStream();
out.write(xmlInfo.getBytes("UTF-8"));
out.flush();
out.close();

input = new InputStreamReader(httpConn.getInputStream(), "UTF-8");
bufReader = new BufferedReader(input);
String line = "";
StringBuilder contentBuf = new StringBuilder();

while ((line = bufReader.readLine()) != null) {
contentBuf.append(line);
}
strResult = contentBuf.toString();

} catch (MalformedURLException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
if (bufReader!=null){
bufReader.close();
}
if (input != null) {
input.close();
}
if (httpConn != null) {
httpConn.disconnect();
}
}
return strResult;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dom4j xml post
相关文章推荐