前段时间开发ACS,是基于SOAP协议的通信,一次通信过程包含多个soap报文,而且也不想普通的webserivice那样,
soap报文是自动生成的。ACS的通信的报文是硬编码编出来的,虽然能正确运行,但是实在是不雅,最近闲来无事,
想着如何用像webservice那样,用Java对象设置参数后,将对象转换成String格式的SOAP报文,这样以后程序的维护
问题就得到解决了。
然后在google中baidu了一把,找了个例子,然后开始试验了。其实程序并不难,写这个文章,主要是帮助那些直接使用SOAP
协议进行开发的朋友们参考,也给自己留个备注,呵呵。
package com.seahigh.acs.soap; import java.util.ArrayList; import java.util.List; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.soap.MessageFactory; import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPFactory; import javax.xml.soap.SOAPHeader; import javax.xml.soap.SOAPMessage; import javax.xml.soap.SOAPPart; import javax.xml.transform.OutputKeys; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.sax.SAXSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.xml.sax.InputSource; /** * * @author 汪心利 * Date 2010-3-30下午02:51:30 * (c)CopyRight seahigh 2010 */ public class SoapUtil { public SOAPPart initSoapPart() throws SOAPException { SOAPMessage soapMessage = MessageFactory.newInstance().createMessage(); SOAPPart soapPart = soapMessage.getSOAPPart(); SOAPEnvelope soapEnvelope = soapPart.getEnvelope(); SOAPHeader soapHeader = soapEnvelope.getHeader(); SOAPElement cwmp = soapEnvelope.addNamespaceDeclaration("cwmp", "urn:dslforum-org:cwmp-1-0"); SOAPElement xsi = soapEnvelope.addNamespaceDeclaration("xsi", "http://www.w3.org/2001/XMLSchema-instance"); SOAPElement xsd = soapEnvelope.addNamespaceDeclaration("xsd", "http://www.w3.org/2001/XMLSchema"); SOAPElement enc = soapEnvelope.addNamespaceDeclaration("SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"); SOAPElement id = soapHeader.addChildElement("ID", "cwmp"); id.setTextContent("1"); return soapPart; } public void soap2String(Source source) throws Exception { if (source != null) { Node root = null; if (source instanceof DOMSource) { root = ((DOMSource) source).getNode(); } else if (source instanceof SAXSource) { InputSource inSource = ((SAXSource) source).getInputSource(); DocumentBuilderFactory dbf = DocumentBuilderFactory .newInstance(); dbf.setNamespaceAware(true); Document doc = dbf.newDocumentBuilder().parse(inSource); root = (Node) doc.getDocumentElement(); } Transformer transformer = TransformerFactory.newInstance() .newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.transform(new DOMSource(root), new StreamResult( System.out)); } } public Source informResponse(SOAPPart part) throws Exception { SOAPEnvelope soapEnvelope = part.getEnvelope(); SOAPBody soapBody = soapEnvelope.getBody(); SOAPElement informRes = soapBody.addChildElement("InformResponse", "cwmp"); SOAPElement max = SOAPFactory.newInstance().createElement( "MaxEnvelopes", "", ""); max.setTextContent("1"); informRes.addChildElement(max); return part.getContent(); } public Source getParameterValues(SOAPPart part, List list) throws Exception { SOAPEnvelope soapEnvelope = part.getEnvelope(); SOAPBody soapBody = soapEnvelope.getBody(); SOAPElement informRes = soapBody.addChildElement("GetParameterValues", "cwmp"); SOAPFactory soapFactory = SOAPFactory.newInstance(); SOAPElement names = soapFactory.createElement("ParameterNames", "", ""); names.addAttribute(new QName("SOAP-ENC:arrayType"), "xsd:string[" + list.size() + "]"); SOAPElement nameElement = null; for (int i = 0; i < list.size(); i++) { nameElement = soapFactory.createElement("string", "", ""); nameElement.setTextContent((String) list.get(i)); names.addChildElement(nameElement); } informRes.addChildElement(names); return part.getContent(); } public static void main(String[] args) throws Exception { SoapUtil util = new SoapUtil(); SOAPPart part = util.initSoapPart(); Source inform = util.getParameterValues(part, util.getTestnames()); util.soap2String(inform); } public List<String> getTestnames() { List<String> list = new ArrayList<String>(); list.add("InternetGatewayDevice.DeviceInfo.X_CT-COM_CPU"); list.add("InternetGatewayDevice.DeviceInfo.X_CT-COM_WorkTime"); list.add("InternetGatewayDevice.DeviceInfo.SoftwareVersion"); list.add("InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.SSID"); list .add("InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_ReceiveNoise"); list .add("InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_LAN-TotalBytesReceived"); list .add("InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_LAN-TotalBytesSent"); list .add("InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_WAN-TotalBytesReceived"); list .add("InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_WAN-TotalBytesSent"); list .add("InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_LAN-TotalPacketsReceived"); list .add("InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_LAN-TotalPacketsSent"); list .add("InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_WAN-TotalPacketsReceived"); list .add("InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_WAN-TotalPacketsSent"); list .add("InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_Stat.ResponsePass"); list .add("InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_Stat.AskPass"); list .add("InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_Stat.SuccessPass"); list.add("InternetGatewayDevice.DeviceInfo.X_CT-COM_Temp"); list .add("InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_Stat.LAN-PacketsError"); list .add("InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_Stat.LAN-TotalBytesReceived"); list .add("InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_Stat.LAN-TotalBytesSent"); list .add("InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_Stat.WAN-TotalBytesReceived"); list .add("InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_Stat.WAN-PacketsError"); list .add("InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_Stat.WAN-TotalBytesSent"); list .add("InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.AssociatedDevice.1.X_CT-COM_ReceiveRate"); list .add("InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.AssociatedDevice.1.X_CT-COM_SendRate"); list.add("InternetGatewayDevice.DeviceInfo.SerialNumber"); list.add("InternetGatewayDevice.DeviceInfo.ManufacturerOUI"); return list; } }
这就是研究的成果了,看下结果:
对应TR069协议中的RCP Method:GetParameterValues
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:cwmp="urn:dslforum-org:cwmp-1-0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <SOAP-ENV:Header> <cwmp:ID>1</cwmp:ID> </SOAP-ENV:Header> <SOAP-ENV:Body> <cwmp:GetParameterValues> <ParameterNames SOAP-ENC:arrayType="xsd:string[27]"> <string>InternetGatewayDevice.DeviceInfo.X_CT-COM_CPU</string> <string>InternetGatewayDevice.DeviceInfo.X_CT-COM_WorkTime</string> <string>InternetGatewayDevice.DeviceInfo.SoftwareVersion</string> <string>InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.SSID</string> <string>InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_ReceiveNoise</string> <string>InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_LAN-TotalBytesReceived</string> <string>InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_LAN-TotalBytesSent</string> <string>InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_WAN-TotalBytesReceived</string> <string>InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_WAN-TotalBytesSent</string> <string>InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_LAN-TotalPacketsReceived</string> <string>InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_LAN-TotalPacketsSent</string> <string>InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_WAN-TotalPacketsReceived</string> <string>InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_WAN-TotalPacketsSent</string> <string>InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_Stat.ResponsePass</string> <string>InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_Stat.AskPass</string> <string>InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_Stat.SuccessPass</string> <string>InternetGatewayDevice.DeviceInfo.X_CT-COM_Temp</string> <string>InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_Stat.LAN-PacketsError</string> <string>InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_Stat.LAN-TotalBytesReceived</string> <string>InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_Stat.LAN-TotalBytesSent</string> <string>InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_Stat.WAN-TotalBytesReceived</string> <string>InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_Stat.WAN-PacketsError</string> <string>InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.X_CT-COM_Stat.WAN-TotalBytesSent</string> <string>InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.AssociatedDevice.1.X_CT-COM_ReceiveRate</string> <string>InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.AssociatedDevice.1.X_CT-COM_SendRate</string> <string>InternetGatewayDevice.DeviceInfo.SerialNumber</string> <string>InternetGatewayDevice.DeviceInfo.ManufacturerOUI</string> </ParameterNames> </cwmp:GetParameterValues> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
CPE InformResponse
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:cwmp="urn:dslforum-org:cwmp-1-0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <SOAP-ENV:Header> <cwmp:ID>1</cwmp:ID> </SOAP-ENV:Header> <SOAP-ENV:Body> <cwmp:InformResponse> <MaxEnvelopes>1</MaxEnvelopes> </cwmp:InformResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>