您当前的位置: 首页 > 

宝哥大数据

暂无认证

  • 1浏览

    0关注

    1029博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Webservice02---SOAP

宝哥大数据 发布时间:2017-09-24 12:57:48 ,浏览量:1

测试SOAP
package com.chb.soap;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import javax.xml.transform.Source;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;

import org.junit.Test;
import org.w3c.dom.Document;

import com.chb.service.User;

/**
 * 测试SOAP协议
 */
public class TestSOAP { 
    private String wsdlUrlStr = "http://localhost:9998/ns?wsdl";
    private String targetNameSpace = "http://service.chb.com/";

    @Test
    public void testIn01() {//测试输入
        try {
            //1、创建消息工厂, 单例模式
            MessageFactory factory = MessageFactory.newInstance();
            //2、根据消息工厂创建SOAPmessage
            SOAPMessage message = factory.createMessage();
            //3、创建SOAPprot
            SOAPPart part = message.getSOAPPart();
            //4、获取信封Envelope
            SOAPEnvelope envelope = part.getEnvelope();
            //5、通过SOAPEnvolope 创建header, 以及body
            SOAPBody body = envelope.getBody();
            /*
             * 6、根据QName创建相应的节点,(QName 就是一个带有命名空间的节点。)
             * 
             */
            QName qName = new QName("http://service.chb.com/", 
                                    "add",                  //localPart 
                                    "q0");                  //命名空间的前缀

            //7.qname添加到body中
            SOAPBodyElement ele = body.addBodyElement(qName);
            //注意: 使用下面的方法会将转换为<,>
            //body.addBodyElement(qName).setValue("2233");

            //8、通过SOAPBodyElement 设置参数的值
            ele.addChildElement("a").setValue("22");
            ele.addChildElement("b").setValue("33");





            //打印消息信息
            message.writeTo(System.out);

        } catch (SOAPException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    @Test
    /**
     * 基于message的方式, 处理消息。
     */
    public void test02() {
        try {
            //1、创建服务(Service)
            //1.1、创建URL , 
            URL wsdlUrl = new URL(wsdlUrlStr);
            //1.2、创建QName;
            QName qName = new QName(targetNameSpace, 
                                    "MyServiceImplService");    //发布服务名称
            Service service = Service.create(wsdlUrl, qName);

            /**
             
                
                    
                
            
             */
            //2、创建Dispatch 
            QName portName = new QName(targetNameSpace, "MyServiceImplPort");
            Dispatch dispatch = service.createDispatch(portName, 
                            SOAPMessage.class, 
                            Service.Mode.MESSAGE);//消息传递方式

            //3、创建SOAPMessage 
            SOAPMessage message = MessageFactory.newInstance().createMessage();
            SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();//获取信封
            SOAPBody body = envelope.getBody();

            //4、创建QName 来指定消息中传递数据
            QName eleQName = new QName(targetNameSpace, "add", "q0");
            SOAPElement ele = body.addBodyElement(eleQName);
            //这个方式会将 转义 <, >
            ele.addChildElement("a").setValue("22");
            ele.addChildElement("b").setValue("33");
            message.writeTo(System.out);//打印一下请求message


            //5、通过Dispatch发送消息。
            System.out.println("\n invoke.....");
            SOAPMessage response = dispatch.invoke(message);
            response.writeTo(System.out);

            //6、获取响应message的参数。
            Document doc = response.getSOAPBody().extractContentAsDocument();
            String result = doc.getElementsByTagName("addResult").item(0).getTextContent();
            System.out.println("\n" + result);

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (SOAPException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }



    @Test
    /**
     * 基于PAYLOAD 方式
     */
    public void test03() {
        try {
            //1、创建服务(Service)
            //1.1、创建URL , 
            URL wsdlUrl = new URL(wsdlUrlStr);
            //1.2、创建QName;
            QName qName = new QName(targetNameSpace, 
                                    "MyServiceImplService");    //发布服务名称
            Service service = Service.create(wsdlUrl, qName);

            /**
             
                
                    
                
            
             */
            //2、创建Dispatch 
            QName portName = new QName(targetNameSpace, "MyServiceImplPort");
            Dispatch dispatch = service.createDispatch(portName, 
                            Source.class, 
                            Service.Mode.PAYLOAD);//消息传递方式
            //使用JAXB 根据用户的对象创建相应的xml
            User user = new User(2, "zhaoer", "sdfwer");
            JAXBContext jaxbContext = JAXBContext.newInstance(User.class);
            jaxbContext.createMarshaller().marshal(user, System.out);



        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (JAXBException e) {
            e.printStackTrace();
        } 


    }

}
1、添加一个对象User

这里写图片描述

2、代码优先

这里写图片描述

客户端
package com.chb.service;

import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;

public class TestClient {
    public static void main(String[] args) throws MalformedURLException {
        //根据提供URL, 访问指定接口
        URL url = new URL("http://localhost:9998/ns?wsdl");

        //QName qName = new QName(namespaceURI, localPart)
        //targetNamespace="http://service.chb.com/" name="MyServiceImplService">  
        //根据wsdl获取namespaceURI, 以及localport
        QName qName = new QName("http://service.chb.com/", "MyServiceImplService");
        //创建服务
        Service service = Service.create(url, qName);
        //通过service来创建接口
        IMyService iMyService = service.getPort(IMyService.class);
        System.out.println(iMyService.add(12, 34));
    }
}   
3、契约优先

这里写图片描述

关注
打赏
1587549273
查看更多评论
立即登录/注册

微信扫码登录

0.3629s