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; } }
相关文章推荐
- PHP通过XML报文格式的POST请求方式,与第三方接口交互(发送xml,获取XML,并解析xml步骤)
- c# 发送post请求到服务器,并解析得到的xml格式的字符串
- Android通过post请求发送一个xml,解析返回xml数据
- angularjs发送post请求,servlet无法用getParameter(name)获取的解决方法,亲测有效
- 获取post发送过来的xml包
- Android通过post请求发送一个xml,解析返回xml数据
- php获取通过http协议post提交过来xml数据及解析xml
- php获取通过http协议post提交过来xml数据及解析xml
- 使用HttpClient 发送get、post请求,及其解析xml返回数据
- Objective-C-使用NSMutableURLRequest发送POST请求,使用NSJSONSerialization解析JSON字符串
- 如何使用Ajax(XMLHttpRequest)发送带参数的请求,以及如何在Servlet中获取请求中的参数
- .NET解析xml字符串,通过反射给实体类对象赋值,获取实体类数据列表
- 使用java程序发送post请求给servlet
- 初涉Ajax,以post或get方法发送数据,以json或xml形式接收服务器返回的请求
- PHP 以POST方式提交XML、获取XML,最后解析XML
- 非FORM格式,使用POST方式向servlet发送请求
- jQuery以Post方式发送请求并获取返回的文件供下载!
- PHP 发送HTTP post请求发送和获取
- asp.net 发送 xml post请求和接收 xml post请求时出现(500) 内部服务器错误(WebClient学习笔记)
- 客户端delphi使用XML与中间层C#.net通信的例子,客户端用idhttp的post发送请求