当前位置 : 主页 > 网页制作 > Nodejs >

WebService的两种客户端调用方式

来源:互联网 收集:自由互联 发布时间:2021-06-24
WebService的两种客户端调用方式 1.先搭建一个WebService接口. 接口类: Java代码 package hello; public interface IHello{ public Stringhello(Stringstr,Stringstr2); } 实现类: Java代码 package hello; public class Hello im
WebService的两种客户端调用方式

1.先搭建一个WebService接口. 

接口类: 
Java代码  
  1. package hello;  
  2.   
  3. public interface IHello {  
  4.       
  5.     public String hello(String str,String str2) ;  
  6.   
  7. }  


实现类: 
Java代码  
  1. package hello;  
  2.   
  3. public class Hello implements IHello{  
  4.   
  5.     public String hello(String str,String str2) {  
  6.         return "Hello world ,i'am "+str+".   第二个参数 = "+str2 ;  
  7.     }  
  8.   
  9. }  


services.xml: 
Xml代码  
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://xfire.codehaus.org/config/1.0">  
  3.     <service>  
  4.         <name>Hello</name>  
  5.         <namespace>rcfeng</namespace>  
  6.         <serviceClass>hello.IHello</serviceClass>  
  7.         <implementationClass>hello.Hello</implementationClass>  
  8.     </service>  
  9. </beans>  


web.xml: 
Xml代码  
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <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">  
  3.   <servlet>  
  4.     <servlet-name>XFireServlet</servlet-name>  
  5.     <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>  
  6.     <load-on-startup>0</load-on-startup>  
  7.   </servlet>  
  8.   <servlet-mapping>  
  9.     <servlet-name>XFireServlet</servlet-name>  
  10.     <url-pattern>/services/*</url-pattern>  
  11.   </servlet-mapping>  
  12.   <welcome-file-list>  
  13.     <welcome-file>index.jsp</welcome-file>  
  14.   </welcome-file-list>  
  15. </web-app>  



注:这里使用XFire搭建WebService,固然需要引用XFire包,以及写法为XFire,不管用什么框架搭建WebService,访问原理都是一样的,所以用任何的客户端都可以访问,需要导入的包在文章尾部注明. 


2.下面介绍调用WebService的两种客户端: 

2.1 XFire客户端: 

XFire客户端访问WebService,需要模拟出WS的接口,接口的结构一般定义接口的服务商会提供,如果是自己写的那就更明确了.. 

模拟WebService接口(这个接口写法跟WS服务器是一样的,但不是同一个项目也不是同一个类): 

客户端接口类: 
这里起名AnyName,意思是任何模拟接口的任何名字都可以,只要需要调用的方法的结构与WS相同即可. 
Java代码  
  1. package xfire;  
  2.   
  3. public interface IAnyName {  
  4.       
  5.     public String hello(String str,String str2) ;  
  6.   
  7. }  



客户端调用类,测试类: 
Java代码  
  1. package xfire;  
  2.   
  3. import org.codehaus.xfire.XFire;  
  4. import org.codehaus.xfire.client.XFireProxyFactory;  
  5. import org.codehaus.xfire.service.Service;  
  6. import org.codehaus.xfire.service.binding.ObjectServiceFactory;  
  7.   
  8. public class XFireTest {  
  9.   
  10.     public static void main(String[] args) {  
  11.           
  12.         try {  
  13.               
  14.             String url = "http://localhost:9415/rcfeng-WebService/services/Hello" ;  
  15.               
  16.             Service service = new ObjectServiceFactory().create(IAnyName.class) ;  
  17.               
  18. //          XFire fire=XFireFactory.newInstance().getXFire();  
  19. //          XFireProxyFactory factory=new XFireProxyFactory(fire);  
  20.             XFireProxyFactory factory = new XFireProxyFactory() ;  
  21.               
  22.             IAnyName hello = (IAnyName) factory.create(service,url) ;  
  23.               
  24.             String str = hello.hello("rcfeng","Parameter two") ;  
  25.               
  26.             System.out.println(str);  
  27.               
  28.         } catch (Exception e) {  
  29.             e.printStackTrace();  
  30.         }  
  31.           
  32.     }  
  33. }  


2.2 Axis客户端: 
Java代码  
  1. package axis;  
  2.   
  3. import org.apache.axis.client.Call;  
  4. import org.apache.axis.client.Service;  
  5. import org.apache.axis.encoding.XMLType;  
  6.   
  7. public class AxisTest {  
  8.       
  9.     public static void main(String[] args) {  
  10.           
  11.         try {  
  12.               
  13.             String str = "rcfeng" ;  
  14.             String endpoint = "http://localhost:9415/rcfeng-WebService/services/Hello" ;  
  15.               
  16.             Service service = new Service() ;  
  17.               
  18.             Call call = (Call) service.createCall() ;  
  19.               
  20.             call.setTargetEndpointAddress(endpoint) ;  
  21.             call.setOperationName("hello") ;//ws方法名  
  22.             //一个输入参数,如果方法有多个参数,复制多条该代码即可,参数传入下面new Object后面  
  23.             call.addParameter("parameter1",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN) ;  
  24.             call.addParameter("parameter2",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN) ;  
  25.             call.setReturnType(XMLType.XSD_STRING) ;  
  26.             call.setUseSOAPAction(true) ;  
  27. //          call.setSOAPActionURI("http://172.20.35.123:6110/cea-ws/services/ChangeMemberPinService");  
  28.               
  29.             String result = (String) call.invoke(new Object[]{str,"Parameter two"}) ;  
  30.               
  31.             System.out.println(result);  
  32.               
  33.         } catch (Exception e) {  
  34.             e.printStackTrace();  
  35.         }  
  36.     }  
  37. }  




以上代码本人测试通过. 

顺便说一点个人理解: 


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包 
网友评论