微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WebService的两种客户端调用方式

WebService的两种客户端调用方式


1.先搭建一个WebService接口. 
接口类: 
Java代码  

收藏代码

@H_502_20@
  • package hello;  
  •   
  • public interface IHello {  
  •       
  •     public String hello(String str,String str2) ;  
  • }  

  • 实现类: 
    class Hello implements IHello{  
  •         return "Hello world ,i'am "+str+".   第二个参数 = "+str2 ;  
  •     }  

  • services.xml: 
    Xml代码  

    收藏代码

      <?xml version="1.0" encoding="UTF-8"?>  
    1. <beans xmlns="http://xfire.codehaus.org/config/1.0">  
    2.     service         name>Hello</namespace>rcfengserviceClass>hello.IHelloimplementationClass>hello.Hellobeans>  

  • web.xml: 
    web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"   servletservlet-name>XFireServletservlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServletload-on-startup>0servlet-mappingurl-pattern>/services/*welcome-file-listwelcome-file>index.jspweb-app注:这里使用XFire搭建WebService,固然需要引用XFire包,以及写法为XFire,不管用什么框架搭建WebService,访问原理都是一样的,所以用任何的客户端都可以访问,需要导入的包在文章尾部注明. 
    2.下面介绍调用WebService的两种客户端: 

    2.1 XFire客户端: 

    XFire客户端访问WebService,需要模拟出WS的接口,接口的结构一般定义接口的服务商会提供,如果是自己写的那就更明确了.. 
    模拟WebService接口(这个接口写法跟WS服务器是一样的,但不是同一个项目也不是同一个类): 
    客户端接口类: 
    这里起名AnyName,意思是任何模拟接口的任何名字都可以,只要需要调用方法的结构与WS相同即可. 
    package xfire;  
  • interface IAnyName {  
  • 客户端调用类,测试类: 
    import org.codehaus.xfire.XFire;  
  • import org.codehaus.xfire.client.XFireProxyFactory;  
  • import org.codehaus.xfire.service.Service;  
  • import org.codehaus.xfire.service.binding.ObjectServiceFactory;  
  • class XFireTest {  
  • static void main(String[] args) {  
  •           
  • try {  
  •               
  •             String url = "http://localhost:9415/rcfeng-WebService/services/Hello" ;  
  •             Service service = new ObjectServiceFactory().create(IAnyName.class) ;  
  • //          XFire fire=XFireFactory.newInstance().getXFire();  
  • //          XFireProxyFactory factory=new XFireProxyFactory(fire);  
  •             XFireProxyFactory factory = new XFireProxyFactory() ;  
  •             IAnyName hello = (IAnyName) factory.create(service,url) ;  
  •             String str = hello.hello("rcfeng","Parameter two") ;  
  •             System.out.println(str);  
  •         } catch (Exception e) {  
  •             e.printstacktrace();  
  •         }  
  • 2.2 Axis客户端: 
    package axis;  
  • import org.apache.axis.client.Call;  
  • import org.apache.axis.client.Service;  
  • import org.apache.axis.encoding.XMLType;  
  • class AxisTest {  
  •             String str = "rcfeng" ;  
  •             String endpoint = "http://localhost:9415/rcfeng-WebService/services/Hello" ;  
  • new Service() ;  
  •             Call call = (Call) service.createCall() ;  
  •             call.setTargetEndpointAddress(endpoint) ;  
  •             call.setoperationName("hello") ;//ws方法  
  •             //一个输入参数,如果方法有多个参数,复制多条该代码即可,参数传入下面new Object后面  
  •             call.addParameter("parameter1",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN) ;  
  •             call.addParameter("parameter2",250)">             call.setReturnType(XMLType.XSD_STRING) ;  
  •             call.setUseSOAPAction(true) ;  
  • //          call.setSOAPActionURI("http://172.20.35.123:6110/cea-ws/services/ChangeMemberPinService");  
  •             String result = (String) call.invoke(new Object[]{str,"Parameter two"}) ;  
  •             System.out.println(result);  
  • 以上代码本人测试通过. 
    顺便说一点个人理解: 
    XFire客户端的调用方式,类似于先指定WS接口的结构,然后从远端地址实例化一个对象到本地,由于方法结构一样,所以可以强行转换.然后直接进行本地调用
    Axis客户端的调用方式类似于HTTP访问,设置好参数后直接远端调用
    ?wsdl地址的来源=服务商提供,如果是你自己做的WebService的话,你可以访问认格式: 
    http://[IP地址:端口]/[项目访问路径]/services 
    如 
    http://localhost:9415/rcfeng-WebService/services 
    至于url的源来,你要先拿到?wsdl地址,然后访问如: 
    http://localhost:9415/rcfeng-WebService/services/Hello?wsdl,然后拉到下面可以看到红色部分: 
    <wsdl:service name="Hello"> 
        <wsdl:port name="HelloHttpPort" binding="tns:HelloHttpBinding"> 
            <wsdlsoap:address location=" http://localhost:9415/rcfeng-WebService/services/Hello " /> 
        </wsdl:port> 
    </wsdl:service> 
    调用方法名为: 
    <wsdl:operation name=" hello "> 
    然后便可以调用WebService的接口了。 
    XFire需要用到的包: 
    activation-1.1.jar 
    commons-beanutils-1.7.0.jar 
    commons-codec-1.3.jar 
    commons-httpclient-3.0.jar 
    commons-logging-1.0.4.jar 
    jaxen-1.1-beta-9.jar 
    jaxws-api-2.0.jar 
    jdom-1.0.jar 
    jsf-api.jar 
    jsf-impl.jar 
    jsr173_api-1.0.jar 
    jstl-1.2.jar 
    mail-1.4.jar 
    saaj-api-1.3.jar 
    saaj-impl-1.3.jar 
    spring-1.2.6.jar 
    stax-api-1.0.1.jar 
    wsdl4j-1.6.1.jar 
    wstx-asl-3.2.0.jar 
    xbean-2.2.0.jar 
    xbean-spring-2.8.jar 
    xfire-aegis-1.2.6.jar 
    xfire-annotations-1.2.6.jar 
    xfire-core-1.2.6.jar 
    xfire-java5-1.2.6.jar 
    xfire-jaxws-1.2.6.jar 
    xfire-jsr181-api-1.0-M1.jar 
    xfire-spring-1.2.6.jar 
    XmlSchema-1.1.jar 
    Axis需要用到的包: 
    axis.jar 
    commons-discovery-0.2.jar 
    注明:以上两种客户端本人是写在同一个项目里,所以Axis需要用到的包看上去少很多,是因为一些通用包在使用XFire的时候已经加进来了. 
    附上项目说明: 
    rcfeng-WebService 为WebService服务端项目 
    rcfeng-TestWebService 为客户端项目 

    rcfeng-WebService项目中没有包,可以到rcfeng-TestWebService\Webroot\WEB-INF\lib\XFire\下获取,另外,rcfeng-WebService项目中是使用MyEclipse引用包,直接导入项目可能需要更新jar路径或删掉路径,然后自己导入jar包 



    附:报错处理:

    webservice [META-INF/xfire/services.xml] cannot be opened because it does not exist


    严重: Allocate exception for servlet XFireServlet
    java.io.FileNotFoundException: class path resource [meta-inf/xfire/services.xml] cannot be opened because it does not exist
    at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:137)
    at org.springframework.beans.factory.xml.XmlBeanDeFinitionReader.loadBeanDeFinitions(XmlBeanDeFinitionReader.java:167)


    在tomcate工程里的 WEB-INF/classes的文件夹下新建一个meta-inf文件夹,然后在里面新建一个xfire文件夹,将services.xml文件放到xfire目录下即可解决

  • 版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

    相关推荐