java發送http,內容爲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數據,然後獲取服務端的響應並進行解析:

Java代碼 複製代碼
  1. String xmlString = "<?xml version='1.0' encoding='gb2312'?>"  
  2.                      + "<Req>"  
  3.                      + "<EventContentReq>"  
  4.                      + "<EventID>101</EventID >"  
  5.                      + "</EventContentReq>"  
  6.                      + "</Req>";   
  7.   
  8. byte[] xmlData = xmlString.getBytes();   
  9.   
  10. String urlStr = "http://124.128.62.164:7001/FetchTaskDataServlet";   
  11.   
  12. DataInputStream input = null;   
  13.   
  14. java.io.ByteArrayOutputStream out = null;   
  15.   
  16. try{   
  17.   
  18.        //獲得到位置服務的鏈接   
  19.   
  20.        URL url = new URL(urlStr);   
  21.   
  22.        URLConnection urlCon = url.openConnection();   
  23.   
  24.        urlCon.setDoOutput(true);   
  25.   
  26.        urlCon.setDoInput(true);   
  27.   
  28.        urlCon.setUseCaches(false);   
  29.   
  30.        //將xml數據發送到位置服務   
  31.   
  32.        urlCon.setRequestProperty("Content-Type""text/xml");   
  33.   
  34.        urlCon.setRequestProperty("Content-length",String.valueOf(xmlData.length));   
  35.   
  36.        DataOutputStream printout = new DataOutputStream(urlCon.getOutputStream());   
  37.   
  38.        printout.write(xmlData);   
  39.   
  40.        printout.flush();   
  41.   
  42.        printout.close();   
  43.   
  44.        input = new DataInputStream(urlCon.getInputStream());   
  45.   
  46.        byte[] rResult;   
  47.   
  48.        out = new java.io.ByteArrayOutputStream();   
  49.   
  50.        byte[] bufferByte = new byte[256];   
  51.   
  52.        int l = -1;   
  53.   
  54.        int downloadSize = 0;   
  55.   
  56.        while ((l = input.read(bufferByte)) > -1) {   
  57.   
  58.            downloadSize += l;   
  59.   
  60.            out.write(bufferByte, 0, l);   
  61.   
  62.            out.flush();   
  63.   
  64.        }   
  65.   
  66.        rResult = out.toByteArray();   
  67.   
  68.        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();   
  69.   
  70.        DocumentBuilder db = dbf.newDocumentBuilder();   
  71.   
  72.        Document d = db.parse(new ByteArrayInputStream(rResult));   
  73.   
  74.        String TaskAddr = d.getElementsByTagName_r("TaskAddr").item(0).getFirstChild().getNodeValue();   
  75.   
  76.        System.out.println("TaskAddr:"+TaskAddr);   
  77.   
  78. }   
  79.   
  80. catch(Exception e){   
  81.   
  82.        e.printStackTrace();   
  83.   
  84. }   
  85.   
  86. finally {   
  87.   
  88.        try {   
  89.   
  90.               out.close();   
  91.   
  92.               input.close();   
  93.   
  94.        }   
  95.   
  96.        catch (Exception ex) {   
  97.   
  98.        }   
  99.   
  100. }  

 三、服務端代碼

服務端一般首先獲取客戶端發來的xml數據,進行解析,並將響應返回給客戶端:

Java代碼 複製代碼
  1. try{   
  2.   
  3. //解析對方發來的xml數據,獲得EventID節點的值   
  4.   
  5.        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();   
  6.   
  7.        DocumentBuilder db = dbf.newDocumentBuilder();   
  8.   
  9.        Document d = db.parse(request.getInputStream());   
  10.   
  11.        String evtid = d.getElementsByTagName_r("EventID").item(0).getFirstChild().getNodeValue();   
  12.   
  13. //                   System.out.println("evtid" + evtid);   
  14.   
  15.        //根據evtid查找任務,生成xml字符串   
  16.   
  17.        UfgovDBUtil dbUtil = new UfgovDBUtil();   
  18.   
  19.        String xmlString = dbUtil.fetchTaskData(evtid);   
  20.   
  21. //                   System.out.println("returned xmlString:" + xmlString);   
  22.   
  23.        //把xml字符串寫入響應   
  24.   
  25.        byte[] xmlData = xmlString.getBytes();   
  26.   
  27.        response.setContentType("text/xml");   
  28.   
  29.        response.setContentLength(xmlData.length);   
  30.   
  31.        ServletOutputStream os = response.getOutputStream();   
  32.   
  33.        os.write(xmlData);   
  34.   
  35.        os.flush();   
  36.   
  37.        os.close();   
  38.   
  39. }   
  40.   
  41. catch(Exception e){   
  42.   
  43.        e.printStackTrace();   
  44.   
  45. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章