六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 59|回复: 0

【旧文】关于Http Post Xml

[复制链接]

升级  90%

9

主题

9

主题

9

主题

童生

Rank: 1

积分
45
 楼主| 发表于 2013-1-15 02:45:15 | 显示全部楼层 |阅读模式
一、概述
在不同的应用之间传递数据,可以通过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 = "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数据,进行解析,并将响应返回给客户端:
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();} 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表