zoukankan      html  css  js  c++  java
  • [Java] webservice soap,wsdl 例子

    java 调用webservice的各种方法总结
    现在webservice加xml技术已经逐渐成熟,但要真正要用起来还需时日!!
    由于毕业设计缘故,我看了很多关于webservice方面的知识,今天和大家一起来研究研究webservice的各种使用方法。

    一、利用jdk web服务api实现,这里使用基于 SOAP message 的 Web 服务
    1.首先建立一个Web services EndPoint: package Hello; 

    import javax.jws.WebService;  
    import javax.jws.WebMethod;  
    import javax.xml.ws.Endpoint;  
    
    @WebService
    public class Hello {
      @WebMethod
      public String hello(String name)
      {     
    return "Hello, " + name + " ";   }

      public static void main(String[] args)
      {
        
    //create and publish an endpoint Hello hello = new Hello(); Endpoint endpoint = Endpoint.publish("http://localhost:8080/hello", hello); } }

    2.使用 apt 编译 Hello.java(例:apt -d [存放编译后的文件目录] Hello.java ) ,会生成 jaws目录

    3.使用java Hello.Hello运行,然后将浏览器指向http://localhost:8080/hello?wsdl就会出现下列显示

    4.使用wsimport 生成客户端

    使用如下:wsimport -p . -keep http://localhost:8080/hello?wsdl

    这时,会在当前目录中生成如下文件:

    5.客户端程序:

    class HelloClient
    {  
        public static void main(String args[])
        {  
            HelloService service = new HelloService();  
            Hello helloProxy = service.getHelloPort();  
            String hello = helloProxy.hello("你好");         
            System.out.println(hello);  
        }  
    }

    以上方法还稍显繁琐,还有更加简单的方法

    二、使用xfire,我这里使用的是myeclipse集成的xfire进行测试的
    利用xfire开发WebService,可以有三种方法:
    1一种是从javabean 中生成;
    2 一种是从wsdl文件中生成;
    3 还有一种是自己建立webservice

    步骤如下:
    用myeclipse建立webservice工程,目录结构如下:

    首先建立webservice接口,代码如下:

    package com.myeclipse.wsExample;
    //Generated by MyEclipse
    public interface IHelloWorldService
    {
        public String example(String message);
        //接着实现这个借口: 1package com.myeclipse.wsExample;
        //Generated by MyEclipse
        public class HelloWorldServiceImpl implements IHelloWorldService
        {
            public String example(String message)
            {
                return message;
            }
        }
    }

    修改service.xml 文件,加入以下代码:

    <service>
        <name>HelloWorldService</name>
        <serviceClass>com.myeclipse.wsExample.IHelloWorldService</serviceClass>
        <implementationClass>com.myeclipse.wsExample.HelloWorldServiceImpl</implementationClass>
        <style>wrapped</style>
        <use>literal</use>
        <scope>application</scope>
    </service>

    把整个项目部署到tomcat服务器中 ,打开浏览器,输入http://localhost:8989/HelloWorld/services/HelloWorldService?wsdl,可以看到如下:
    然后再展开HelloWorldService后面的wsdl可以看到:

    客户端实现如下:

    package com.myeclipse.wsExample.client;
    import java.net.MalformedURLException;
    import java.net.URL;
    
    import org.codehaus.xfire.XFireFactory;
    import org.codehaus.xfire.client.Client;
    import org.codehaus.xfire.client.XFireProxyFactory;
    import org.codehaus.xfire.service.Service;
    import org.codehaus.xfire.service.binding.ObjectServiceFactory;
    import com.myeclipse.wsExample.IHelloWorldService;
    
    public class HelloWorldClient
    {
        public static void main(String[] args) throws MalformedURLException, Exception 
        {
            // TODO Auto-generated method stub
            Service s=new ObjectServiceFactory().create(IHelloWorldService.class);
            XFireProxyFactory xf=new XFireProxyFactory(XFireFactory.newInstance().getXFire());
            String url="http://localhost:8989/HelloWorld/services/HelloWorldService";
            try
            {
                IHelloWorldService hs=(IHelloWorldService) xf.create(s,url);
                String st=hs.example("zhangjin");
                System.out.print(st);
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
    
    }

    这里再说点题外话,有时候我们知道一个wsdl地址,比如想用java客户端引用.net 做得webservice,使用myeclipse引用,但是却出现无法通过验证的错误,这时我们可以直接在类中引用,步骤如下:

    public static void main(String[] args) throws MalformedURLException, Exception 
    {
        // TODO Auto-generated method stub
        Service s=new ObjectServiceFactory().create(IHelloWorldService.class);
         XFireProxyFactory xf=new XFireProxyFactory(XFireFactory.newInstance().getXFire());
    
        //远程调用.net开发的webservice
        Client c=new Client(new URL("http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl"));
        Object[] o=c.invoke("qqCheckOnline", new String[]{"531086641","591284436"});
        
        //调用.net本机开发的webservice
        Client c1=new Client(new URL("http://localhost/zj/Service.asmx?wsdl"));
        Object[] o1=c1.invoke("HelloWorld",new String[]{}); 
    }

    三、使用axis1.4调用webservice方法
    前提条件:下载axis1.4包和tomcat服务器   ,并将axis文件夹复制到tomcat服务器的webapp文件夹中
    这里我就说一下最简单的方法:
    首先建立一个任意的java类(例如:HelloWorld.java),复制到axis文件夹下,将其扩展名改为jws,然后重新启动tomcat,在浏览器中输入http://localhost:8989/axis/HelloWorld.jws?wsdl,就会得到一个wsdl文件,其客户端调用方法如下:

    import javax.xml.rpc.Service;
    import javax.xml.rpc.ServiceException;
    import javax.xml.rpc.ServiceFactory;
    
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.rmi.RemoteException;
    
    import javax.xml.namespace.QName;
    
    public class TestHelloWorld
    {
        public static void main(String[] args) throws MalformedURLException, ServiceException, RemoteException
        {
            // TODO Auto-generated method stub
            String wsdlUrl ="http://localhost:8989/axis/HelloWorld.jws?wsdl";
            String nameSpaceUri ="http://localhost:8989/axis/HelloWorld.jws";
            String serviceName = "HelloWorldService";
            String portName = "HelloWorld";
    
            ServiceFactory serviceFactory = ServiceFactory.newInstance();
            Service afService =serviceFactory.createService(new URL(wsdlUrl),new QName(nameSpaceUri, serviceName));
            HelloWorldInterface proxy = (HelloWorldInterface)afService.getPort(new QName(nameSpaceUri, portName),HelloWorldInterface.class);
            System.out.println("return value is "+proxy.getName("john") ) ;
    
        }
    }

    四、使用axis2开发webservice(这里首先感谢李宁老师)   
    使用axis2 需要先下载

    axis2-1.4.1-bin.zip

    axis2-1.4.1-war.zip

    http://ws.apache.org/axis2/
    同理,也需要将axis2复制到webapp目录中
    在axis2中部署webservice有两种方法,
    第一种是pojo方式,这种方式比较简单,但是有一些限制,例如部署的类不能加上包名
    第二种方式是利用xml发布webservice,这种方法比较灵活,不需要限制类的声明
    下面分别说明使用方法:
    1.pojo方式:在Axis2中不需要进行任何的配置,就可以直接将一个简单的POJO发布成WebService。其中POJO中所有的public方法将被发布成WebService方法。先实现一个pojo类:

    public class HelloWorld
    {
        public String getName(String name)
        {
            return "你好 " + name;
        } 
    
        public int add(int a,int b)
        {
            return a+b;
        }   
    }

    由于这两个方法都是public类型,所以都会发布成webservice。编译HelloWorld类后,将HelloWorld.class文件放到%tomcat%webappsaxis2WEB-INFpojo目录中(如果没有pojo目录,则建立该目录),然后打开浏览器进行测试:
    输入一下url:
    http://localhost:8080/axis2/services/listServices

    会列出所有webservice

    这是其中的两个webservice列表,接着,在客户端进行测试:
    首先可以写一个封装类,减少编码,代码如下:

    package MZ.GetWebService;
    import javax.xml.namespace.QName;
    import org.apache.axis2.AxisFault;
    import org.apache.axis2.addressing.EndpointReference;
    import org.apache.axis2.client.Options;
    import org.apache.axis2.rpc.client.RPCServiceClient;
    
    public class GetWSByAxis2
    {
        private static String EndPointUrl;
        private static String QUrl="http://ws.apache.org/axis2";
        private QName opAddEntry;
        public String WSUrl;
        public RPCServiceClient setOption() throws AxisFault
        {
            RPCServiceClient serviceClient = new RPCServiceClient();
            Options options = serviceClient.getOptions();
            EndpointReference targetEPR = new EndpointReference(WSUrl);
            options.setTo(targetEPR);
            return serviceClient;
        }
    
        public QName getQname(String Option)
        {
            return new QName (QUrl,Option);
        }
        
        //返回String
        public String getStr(String Option) throws AxisFault
        {
            RPCServiceClient serviceClient =this.setOption();
    
            opAddEntry =this.getQname(Option);
    
            String str = (String) serviceClient.invokeBlocking(opAddEntry,
            new Object[]{}, new Class[]{String.class })[0];
            return str;
        }
        
        // 返回一维String数组
        public String[] getArray(String Option) throws AxisFault
        {
            RPCServiceClient serviceClient =this.setOption();
    
            opAddEntry =this.getQname(Option);
    
            String[] strArray = (String[]) serviceClient.invokeBlocking(opAddEntry,
            new Object[]{}, new Class[]{String[].class })[0];
            return strArray;
        }
    
        //从WebService中返回一个对象的实例
        public Object getObject(String Option,Object o) throws AxisFault
        {
            RPCServiceClient serviceClient =this.setOption();
            QName qname=this.getQname(Option);
            Object object = serviceClient.invokeBlocking(qname, new Object[]{},new Class[]{o.getClass()})[0];
            return object;
        }
    
    /////////////////////////////////////////       读者可以自己封装数据类型,如int,byte,float等数据类型
    }

    客户端调用方法:

    MZ.GetWebService.GetWSByAxis2 ws=new MZ.GetWebService.GetWSByAxis2();
    ws.WSUrl="http://localhost:8989/axis2/services/HelloWorld";
    HelloWorld hello= (HelloWorld)ws.getObject("getName", HelloWorld.class);
    System.out.println(hello.getName("zhangjin"));

    使用service.xml发布webservice,这种方式和直接放在pojo目录中的POJO类不同。要想将MyService类发布成Web Service,需要一个services.xml文件,这个文件需要放在META-INF目录中,该文件的内容如下:

    <service name="HelloWorld">
        <description>
            HelloWorld webservice
        </description>
        <parameter name="ServiceClass">
            service.HelloWorld
        </parameter>
        <messageReceivers>
            <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
                class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
            <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
                class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
        </messageReceivers>
    </service>

    其中<service>元素用于发布Web Service,一个<service>元素只能发布一个WebService类,name属性表示WebService名,如下面的URL可以获得这个WebService的WSDL内容:
    http://localhost:8080/axis2/services/myService?wsdl
    除此之外,还有直接可以在其中制定webservice操作方法:可以这样些service.xml文件

    <service name="HelloWorld">
        <description>
           HelloWorld service
        </description>
        <parameter name="ServiceClass">
            service.HelloWorld
        </parameter>
        <operation name="getName">
            <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
        </operation>
        <operation name="add">
           <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
        </operation>
    </service>

    如果要发布多个webservice,可以在文件两段加上<serviceGroup><service></service>...<service>< /service></serviceGroup>发布

    --------------------------------------

    欢迎您,进入 我系程序猿 的cnBlog博客。

    你不能改变你的过去,但你可以让你的未来变得更美好。一旦时间浪费了,生命就浪费了。

    You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.

    --------------------------------------

    分享到QQ空间  

  • 相关阅读:
    Palindrome Linked List 解答
    Word Break II 解答
    Array vs Linked List
    Reverse Linked List II 解答
    Calculate Number Of Islands And Lakes 解答
    Sqrt(x) 解答
    Find Median from Data Stream 解答
    Majority Element II 解答
    Binary Search Tree DFS Template
    188. Best Time to Buy and Sell Stock IV
  • 原文地址:https://www.cnblogs.com/jqmtony/p/3711420.html
Copyright © 2011-2022 走看看