实现axis2两种不同方式的客户端

来源:互联网 发布:淘宝买家秀福利搜什么 编辑:程序博客网 时间:2024/05/16 17:57

通过我的上一篇文章,相信有一定基础的人都可以用axis2开发和部署一个web service服务了。现在我们把焦点放在客户端。下面我主要以代码来说话了。

 

1.一个简单的服务类 ,并把它发布为web service服务。注意我的工程名为Test

Java代码 复制代码
  1. package test;   
  2.   
  3. public class TestService {   
  4.        
  5.     public int add(int a, int b) {   
  6.         return a + b;   
  7.     }   
  8.        
  9.     public String each(String name) {   
  10.         return name  + "你好";   
  11.     }   
  12.   
  13. }  

2.应用两种方式实现客户端调用

Java代码
  1. import javax.xml.namespace.QName;   
  2.   
  3. import org.apache.axiom.om.OMAbstractFactory;   
  4. import org.apache.axiom.om.OMElement;   
  5. import org.apache.axiom.om.OMFactory;   
  6. import org.apache.axiom.om.OMNamespace;   
  7. import org.apache.axis2.AxisFault;   
  8. import org.apache.axis2.addressing.EndpointReference;   
  9. import org.apache.axis2.client.Options;   
  10. import org.apache.axis2.client.ServiceClient;   
  11. import org.apache.axis2.rpc.client.RPCServiceClient;   
  12.   
  13. /**  
  14.  * axis2提供rpc和document两种style的实现。  
  15.  * 在这里我们别对其验证。关于说明,请参看代码中的注释  
  16.  * @author Administrator  
  17.  *  
  18.  */  
  19. public class Client {   
  20.        
  21.     public static void main(String[] args) {   
  22.            
  23.         Client client = new Client();   
  24.         //测试rpc方式   
  25.         client.testRPC();   
  26.            
  27.         //测试document方式   
  28.         client.testDocument();   
  29.     }   
  30.        
  31.     /**  
  32.      * 应用rpc的方式调用  
  33.      * 这种方式就等于远程调用,即通过url定位告诉远程服务器,告知方法名称,参数等,  
  34.      * 调用远程服务,得到结果。  
  35.      */  
  36.     //下面这个annotaion是为了不让代码出现关于没有应用泛型的警告信息   
  37.     //用elipse做编辑器的很容易理解。   
  38.     @SuppressWarnings("unchecked")   
  39.     public void testRPC() {   
  40.         try {   
  41.             RPCServiceClient serviceClient = new RPCServiceClient();   
  42.             Options options = serviceClient.getOptions();   
  43.             //指定访问的web service地址   
  44.             EndpointReference targetEPR = new EndpointReference(   
  45.                     "http://localhost:8080/Test/services/TestService");   
  46.             options.setTo(targetEPR);   
  47.   
  48.             //指定方法,注意指定命名空间   
  49.             QName opPrint = new QName("http://test",   
  50.                     "add");   
  51.             //确定参数类型和参数值   
  52.             Class[] returnTypes = new Class[] { int.class };   
  53.             Object obj[] = new Object[] { 12 };   
  54.             //得到返回结果,是一个数组   
  55.             Object[] order = serviceClient.invokeBlocking(opPrint, obj,   
  56.                     returnTypes);   
  57.             System.out.println(order[0]);   
  58.                
  59.                
  60.             //下面是测试each方法的。和上面类似   
  61.             opPrint = new QName("http://test","each");   
  62.             returnTypes = new Class[] { String.class };   
  63.             obj = new Object[] { "zhangyt" };   
  64.             order = serviceClient.invokeBlocking(opPrint, obj,   
  65.                     returnTypes);   
  66.             System.out.println(order[0]);   
  67.                
  68.         } catch (AxisFault e) {   
  69.             e.printStackTrace();   
  70.         }      
  71.     }   
  72.        
  73.     /**  
  74.      * 应用document方式调用  
  75.      * 用ducument方式应用现对繁琐而灵活。现在用的比较多。因为真正摆脱了我们不想要的耦合 
  76.      */  
  77.     public void testDocument() {   
  78.         try {   
  79.             ServiceClient sc = new ServiceClient();   
  80.             Options opts = new Options();   
  81.             //确定目标服务地址   
  82.             opts.setTo(new EndpointReference(   
  83.                     "http://localhost:8080/Test/services/TestService"));   
  84.             //确定调用方法   
  85.             opts.setAction("urn:add");   
  86.             sc.setOptions(opts);   
  87.             //发送请求并并得到返回结果,注意参数生成方法的分析   
  88.             OMElement res = sc.sendReceive(createPayLoad());   
  89.             //值得注意的是,返回结果就是一段由OMElement对象封装的xml字符串。  
  90.             //我们可以对之灵活应用,下面我取第一个元素值,并打印之。因为调用的方法返回一个结果  
  91.             res.getFirstElement().getText();   
  92.             System.out.println(res.getFirstElement().getText());   
  93.         } catch (AxisFault e) {   
  94.             e.printStackTrace();   
  95.         }   
  96.     }   
  97.     /**  
  98.      * ServiceClient 中 sendReceive(OMElement args) 方法参数的生成 
  99.      * @return  
  100.      */  
  101.     public static OMElement createPayLoad(){    
  102.         OMFactory fac = OMAbstractFactory.getOMFactory();   
  103.         //指定命名空间   
  104.         OMNamespace omNs = fac.createOMNamespace("http://test""nsl");   
  105.         //指定方法   
  106.         OMElement method = fac.createOMElement("add",omNs);   
  107.         //指定方法的参数   
  108.         OMElement value = fac.createOMElement("value",omNs);    
  109.         value.setText("1");    
  110.         method.addChild(value);    
  111.         OMElement value1 = fac.createOMElement("value",omNs);   
  112.         value1.setText("2");   
  113.         method.addChild(value1);   
  114.         //返回方法(实际上就是OMElement封装的xml字符串)   
  115.         return method;    
  116.     }   
  117.   
  118. }  

注意上面实现document方式调用的时候,只测试了服务类中的add方法。这个方法都用了,each方法调用的写法就可知比这个还要简单。

原创粉丝点击