我们开始熟悉一下webService的内容,SOAP的结构,以及如何不通过命令行调用接口方法。
首先我们再学习一的项目里创建SoapTest类
然后创建Test方法代码如下
@Test public void test() throws SOAPException, IOException{ MessageFactory mf=MessageFactory.newInstance(); SOAPMessage soapMsg=mf.createMessage(); SOAPPart part=soapMsg.getSOAPPart(); SOAPEnvelope envelope=part.getEnvelope(); SOAPBody body=envelope.getBody(); QName qName = new QName("http://Service.dhh.com/", "add", "ns"); SOAPElement elment=body.addBodyElement(qName); elment.addChildElement("a").setValue("120"); elment.addChildElement("b").setValue("220"); soapMsg.writeTo(System.out); }
打印内容打印在控制台上如下
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Header/> <SOAP-ENV:Body> <ns:add xmlns:ns="http://Service.dhh.com/"> <a>120</a> <b>220</b> </ns:add> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
那么 QName的构造参数为new QName("(命名空间)", "(接口方法)", "(前缀)");
有种方法可以不需要像学习一这么麻烦创建实体类,具体代码如下
public static void main(String[] args) throws IOException, SOAPException { //1链接服务 URL url = new URL("http://localhost:8888/myservice?wsdl"); //命名空间,我具体实现类(参考浏览器的service标签) QName qName = new QName("http://Service.dhh.com/", "MyServiceService"); Service service = Service.create(url, qName); //2创建Dispatch //QName:我方命名空间,我具体实现类的port(参考浏览器的service标签下的port) Dispatch<SOAPMessage> dispatch=service.createDispatch(new QName("http://Service.dhh.com/", "MyServicePort"), SOAPMessage.class, Service.Mode.MESSAGE); //3创建SOAP对象 SOAPMessage msg = MessageFactory.newInstance().createMessage(); SOAPEnvelope envelope = msg.getSOAPPart().getEnvelope(); SOAPBody body = envelope.getBody(); //创建QName来指定消息中传递的数据 QName参数3前缀不能为空 QName ename = new QName("http://Service.dhh.com/", "add", "q"); SOAPBodyElement element = body.addBodyElement(ename); //对应之前接口命名的@WebParam(name="a") element.addChildElement("a").setValue("22"); //对应之前接口命名的@WebParam(name="b") element.addChildElement("b").setValue("33"); //4发送并返回数据 SOAPMessage responseMsg = dispatch.invoke(msg); Document doc = responseMsg.getSOAPPart().getEnvelope().getBody().extractContentAsDocument(); //getElementsByTagName("addResult")对应之前接口命名的方法注解@WebResult(name="addResult") //选取第一个0节点得到内容 String result = doc.getElementsByTagName("addResult").item(0).getTextContent(); System.out.println("a+b="+result); /*简写不错可以直接调用出Body,但是例子中繁杂的写法更容易理解SOAP的结构 * System.out.println(responseMsg.getSOAPBody().extractContentAsDocument().getElementsByTagName("addResult").item(0).getTextContent()); */ }
详情看注释 这段代码需要结合学习一的服务端