关于Http Post XML

    技术2022-05-19  20

    一、概述

    在不同的应用之间传递数据,可以通过web service的方法,同时还可以通过Http Post Xml的方法,相比而言,通过web service传递数据灵活,但是配置起来较为麻烦,涉及到新知识的学习,而通过Http Post Xml传递数据,不需要涉及新的知识,但是灵活性稍差,需要客户端和服务端事先约定好xml数据的结构。

    Http Post Xml方式传递数据在跟移动、联通等电信运营商之间合作时,经常会用到,一般涉及到下面的知识点:

    Ø         Java网络编程(java.net包)

    Ø         Java IO编程(java.io包)

    Ø         文档对象模型(DOM)

    Ø         Java解析xml(javax.xml.parsers包)

    二、客户端代码

    通过Http Post Xml传递数据,客户端一般是通过URL建立到服务端的连接,向服务端发送xml数据,然后获取服务端的响应并进行解析:

    Java代码 String xmlString = "<?xml version='1.0' encoding='gb2312'?>"                       + "<Req>"                       + "<EventContentReq>"                       + "<EventID>101</EventID >"                       + "</EventContentReq>"                       + "</Req>";     byte[] xmlData = xmlString.getBytes();     String urlStr = "http://124.128.62.164:7001/FetchTaskDataServlet";     DataInputStream input = null;     java.io.ByteArrayOutputStream out = null;     try{            //获得到位置服务的链接            URL url = new URL(urlStr);            URLConnection urlCon = url.openConnection();            urlCon.setDoOutput(true);            urlCon.setDoInput(true);            urlCon.setUseCaches(false);            //将xml数据发送到位置服务            urlCon.setRequestProperty("Content-Type""text/xml");            urlCon.setRequestProperty("Content-length",String.valueOf(xmlData.length));            DataOutputStream printout = new DataOutputStream(urlCon.getOutputStream());            printout.write(xmlData);            printout.flush();            printout.close();            input = new DataInputStream(urlCon.getInputStream());            byte[] rResult;            out = new java.io.ByteArrayOutputStream();            byte[] bufferByte = new byte[256];            int l = -1;            int downloadSize = 0;            while ((l = input.read(bufferByte)) > -1) {                downloadSize += l;                out.write(bufferByte, 0, l);                out.flush();            }            rResult = out.toByteArray();            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();            DocumentBuilder db = dbf.newDocumentBuilder();            Document d = db.parse(new ByteArrayInputStream(rResult));            String TaskAddr = d.getElementsByTagName("TaskAddr").item(0).getFirstChild().getNodeValue();            System.out.println("TaskAddr:"+TaskAddr);     }     catch(Exception e){            e.printStackTrace();     }     finally {            try {                   out.close();                   input.close();            }            catch (Exception ex) {            }     }   String xmlString = "<?xml version='1.0' encoding='gb2312'?>" + "<Req>" + "<EventContentReq>" + "<EventID>101</EventID >" + "</EventContentReq>" + "</Req>"; byte[] xmlData = xmlString.getBytes(); String urlStr = "http://124.128.62.164:7001/FetchTaskDataServlet"; DataInputStream input = null; java.io.ByteArrayOutputStream out = null; try{ //获得到位置服务的链接 URL url = new URL(urlStr); URLConnection urlCon = url.openConnection(); urlCon.setDoOutput(true); urlCon.setDoInput(true); urlCon.setUseCaches(false); //将xml数据发送到位置服务 urlCon.setRequestProperty("Content-Type", "text/xml"); urlCon.setRequestProperty("Content-length",String.valueOf(xmlData.length)); DataOutputStream printout = new DataOutputStream(urlCon.getOutputStream()); printout.write(xmlData); printout.flush(); printout.close(); input = new DataInputStream(urlCon.getInputStream()); byte[] rResult; out = new java.io.ByteArrayOutputStream(); byte[] bufferByte = new byte[256]; int l = -1; int downloadSize = 0; while ((l = input.read(bufferByte)) > -1) { downloadSize += l; out.write(bufferByte, 0, l); out.flush(); } rResult = out.toByteArray(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document d = db.parse(new ByteArrayInputStream(rResult)); String TaskAddr = d.getElementsByTagName("TaskAddr").item(0).getFirstChild().getNodeValue(); System.out.println("TaskAddr:"+TaskAddr); } catch(Exception e){ e.printStackTrace(); } finally { try { out.close(); input.close(); } catch (Exception ex) { } }

     三、服务端代码

    服务端一般首先获取客户端发来的xml数据,进行解析,并将响应返回给客户端:

    Java代码 try{     //解析对方发来的xml数据,获得EventID节点的值            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();            DocumentBuilder db = dbf.newDocumentBuilder();            Document d = db.parse(request.getInputStream());            String evtid = d.getElementsByTagName("EventID").item(0).getFirstChild().getNodeValue();     //                   System.out.println("evtid" + evtid);            //根据evtid查找任务,生成xml字符串            UfgovDBUtil dbUtil = new UfgovDBUtil();            String xmlString = dbUtil.fetchTaskData(evtid);     //                   System.out.println("returned xmlString:" + xmlString);            //把xml字符串写入响应            byte[] xmlData = xmlString.getBytes();            response.setContentType("text/xml");            response.setContentLength(xmlData.length);            ServletOutputStream os = response.getOutputStream();            os.write(xmlData);            os.flush();            os.close();     }     catch(Exception e){            e.printStackTrace();     }  

    最新回复(0)