一、概述
在不同的应用之间传递数据,可以通过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数据,然后获取服务端的响应并进行解析:
自己写了个公共类BaseServletRequest.java 免得各个地方使用的时候还要又写一次,代码如下
- public class BaseServletRequest
- {
- public static Document doTheProcess(String xmlString, String urlStr)
- {
- DataInputStream input = null;
- java.io.ByteArrayOutputStream out = null;
- try
- {
- byte[] xmlData = xmlString.getBytes();
- // 获得到位置服务的链接
- 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));
- return d;
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- finally
- {
- try
- {
- out.close();
- input.close();
- }
- catch (Exception ex)
- {
- ex.printStackTrace();
- }
- }
- return null;
- }
- }
三、客户端的实现,调用了刚才公共类的处理 ClientDemo.java
- public class ClientDemo
- {
- public static void main(String[] args)
- {
- String xmlString = "<?xml version='1.0' encoding='gb2312'?><Req><EventContentReq>"
- + "<EventID>101</EventID></EventContentReq></Req>";
- String urlStr = "http://localhost:8080/Foster_Blog/HttpRequestDemo";
- // 调用参数传递,返回一个document,要什么值再直接从中去取。
- Document d = BaseServletRequest.doTheProcess(xmlString, urlStr);
- String TaskAddr = d.getElementsByTagName("TaskAddr").item(0).getFirstChild().getNodeValue();
- System.out.println("TaskAddr:" + TaskAddr);
- }
- }
四、服务器端代码
- protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException,
- IOException
- {
- 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字符串(格式要正确。。)
- String xmlString = "<Req>" + "<EventContentReq>"
- + "<TaskAddr> U should study.....</TaskAddr >" + "</EventContentReq>" + "</Req>";
- 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();
- }
- }