最近遇到个项目,登录鉴权部分。
HTTP 消息头的请求行示例:
POST/mms/LoginAuth HTTP/1.1:
<Login_reqReq> <userName>用户名</userName> <pass>密码</pass> </Login_reqReq>
响应的是xml格式的数据信息。
一开始还真没点头绪,不知道这个xml咋请求的,是不是也写成a.do?userName=用户名&pass=111。
在网上搜了下资料,自己还真是有点见识浅薄呀~~这个都不知道
在不同的应用之间传递数据,可以通过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; } }
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(); } }