webService入门学习(二)

我们开始熟悉一下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());
          */
    }

详情看注释  这段代码需要结合学习一的服务端

原文地址:https://www.cnblogs.com/blackdeng/p/7793883.html