關於Http Post Xml
關於Http Post Xml
一、概述
在不同的應用之間傳遞數據,可以通過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數據,然後獲取服務端的響應並進行解析:
- String xmlString = "<?xml version='1.0' encoding='gb2312'?>"
- + "<Req>"
- + "<EventContentReq>"
- + "<EventID>101</EventID >"
- + "</EventContentReq>"
- + "</Req>";
- byte[] xmlData = xmlString.getBytes();
- String urlStr = "https://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_r("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 = "https://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_r("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數據,進行解析,並將響應返回給客戶端:
- try{
- //解析對方發來的xml數據,獲得EventID節點的值
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- DocumentBuilder db = dbf.newDocumentBuilder();
- Document d = db.parse(request.getInputStream());
- String evtid = d.getElementsByTagName_r("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();
- }
最後更新:2017-04-02 06:51:32