• 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());
              */
        }

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

  • 相关阅读:
    LeetCode 222. Count Complete Tree Nodes
    k8s控制节点etcd删除并重新加入
    k8s证书延长时间(二)
    二进制安装多master节点的k8s集群(2)
    kubeadm安装多master节点的k8s集群(1)
    OutOfMemoryError异常总结
    使用线程
    操作系统基础
    java 代码执行顺序
    jvm的内存模型
  • 原文地址:https://www.cnblogs.com/blackdeng/p/7793883.html
Copyright © 2020-2023  润新知