axis2客户端调用服务器

来源:互联网 发布:网络兼职什么项目最好 编辑:程序博客网 时间:2024/04/28 14:02

  最近的工作是java和c++的交互,利用的就是webservice;博客中介绍了如何利用java生成webservice,这篇博客接着说如何利用java调用webservice。

        我主要用的是axis2工具来实现java的webservice调用。

        我比较常用的两种方法一个是直接利用RPCServiceClient的invokeBlocking方法,另外一种是OMAbstractFactory的createOMElement方法。其实这两种方式本质是一样的都是处理xml。因为webservice的基石就是xml。如果你用一个抓包工具来查看相关传输协议的传输信息的话,你会发现,其实这两种方式的执行过程都是通过互相传送xml数据来进行相关的webservice方法调用的。

         主要过程就是java通过上面的方法把webservice的xml信息接收到,之后在把调用方法的参数信息填写到xml中,之后webservice服务端就通过你所填写的参数,执行相应的方法,返回相应的数据到xml中,之后java客户端进行解析之后获得相应的数据。这就是简单的一个执行流程。

         知道执行流程之后,我们就要说说这两种方法的具体使用了。

         首先导入jar是必须的,还是axis2的jar,不介绍怎么弄了,比较简单。

         第一种方法:

[java] view plain copy
 print?
  1. RPCServiceClient serviceClient = newRPCServiceClient();  
  2.   
  3. Optionsoptions = serviceClient.getOptions();  
  4.   
  5. EndpointReferencetargetEPR = new EndpointReference(url);  
  6.   
  7. options.setTo(targetEPR);  
  8.   
  9. // 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,也就是<wsdl:definitions>元素的targetNamespace属性值  
  10.   
  11.  QName opAddEntry = new QName("http://service.wf.cypheta.com",method);  


 

        主要是建立RPCServiceClient客户对象,通过这个对象我们能够通过传入相应的webservice地址完成我们相应接口的调用。上面的url就是我们要传入的webservice的url。之后我们要建立QName对象,QName其实说白了就是有着特定格式的xml元素(命名空间+特定元素),我们通过传入命名空间和特定元素(这里是我们要调用的方法)之后定位到我们要执行方法的xml文件信息。

        随后就是定义传入参数和返回值信息:

                    

[java] view plain copy
 print?
  1. <span style="color:black;">                      Object[] opAddEntryArgs = new Object[]{481L};  
  2.   
  3.                       // 返回参数类型,这个和axis1有点区别  
  4.   
  5.                       // invokeBlocking方法有三个参数,其中第一个参数的类型是QName对象,表示要调用的方法名;  
  6.   
  7.                       // 第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];  
  8.   
  9.                       // 第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[]。  
  10.   
  11.                       // 当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}  
  12.   
  13.                       // 如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法,  
  14.   
  15.                       // 该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同  
  16.   
  17.                       Class[] classes = new Class[] {String.class };  
  18.   
  19.                       /*                Object[] object=serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs,classes); 
  20.  
  21.                       for(int i=0;i<object.length;i++){ 
  22.  
  23.                              System.out.println(object[i]); 
  24.  
  25.                       }*/  
  26.   
  27.                       System.out.println(serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs,classes)[0].toString());</span>  


         最后通过invokeBlocking方法获得一个对象数组,这里面它已经给我封装好了xml交互的操作,所以我们非常轻松的就能够调用webservice接口并且获得我们相应的数据。

 

        第二种方法:

         这种方法主要是自己动手来实现xml的交互:这里面包括四部分:1、设置发送请求的URL;2、设置调用的webservice地址;3、获得返回的xml数据;4、利用dom4j解析webservice返回的数据。

第一步:

[java] view plain copy
 print?
  1. OMFactory fac = OMAbstractFactory.getOMFactory();  
  2.   
  3. OMNamespaceomNs =fac.createOMNamespace("http://www.primeton.com/WSProcessInstManagerService"""); // 命名空间  
  4.   
  5. OMElementdata = fac.createOMElement(method, omNs);// 获得要调用的方法名  
  6.   
  7. if(params.length!=0){  
  8.   
  9.        for (int i = 0; i< params.length; i++) {  
  10.   
  11.               OMElementinner = fac.createOMElement(params[i], omNs); // 获得该方法名要调用的参数名  
  12.   
  13.               inner.setText(String.valueOf(paramValues[i]));// 输入参数  
  14.   
  15.               data.addChild(inner);  
  16.   
  17.        }  
  18.   
  19. }  
  20.   
  21. // 将该参数加入要调用的方法节点  
  22.   
  23. return data;  


         这一步主要是设置发送请求的url,也就是我们要设置我们要调用的方法和要传入的参数,从上面代码我们能够看出,我们首先要创建这样一个xml文件,主要包含的数据就是命名空间和方法名称还有就是方法的参数信息

         第二步:

[java] view plain copy
 print?
  1. Options options = newOptions();  
  2.   
  3. options.setSoapVersionURI(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);  
  4.   
  5. options.setAction("http://www.primeton.com/WSProcessInstManagerService" +method); // 设置调用的命名空间加方法  
  6.   
  7. options.setTo(targetAirline);  
  8.   
  9. options.setTransportInProtocol(Constants.TRANSPORT_HTTP); // 设置传输协议  
  10.   
  11. return options;  


         这部分主要是设置调用的webservice地址,这一步和上面那种方法的前三句代码是一个作用,都是把调用的webservice的url设置好。

         第三步:

[java] view plain copy
 print?
  1. try {  
  2.   
  3.        ServiceClientsender = new ServiceClient();  
  4.   
  5.        sender.setOptions(buildOptions(method));  
  6.   
  7.        OMElementresult = sender.sendReceive(buildParam(params,  
  8.   
  9.                      paramValues,method));  
  10.   
  11.        System.out.println("解析之前的数据:" +result.toString());  
  12.   
  13.        returnresult.toString();  
  14.   
  15. catch(Exception e) {  
  16.   
  17.        e.printStackTrace();  
  18.   
  19.        System.out.println("调用出错!");  
  20.   
  21.        return"调用出错!";  
  22.   
  23. }  


          这一步主要是完成相关方法的调用,将我们之前设置好的要发送的xml信息发送给我们的webservice,webservice通过解析我们的xml请求,执行相应的方法,返回相应的信息,这个信息是以xml的形式返回出来的。

          最后一步:

[java] view plain copy
 print?
  1. try {  
  2.   
  3.        Documentdoc = DocumentHelper.parseText(getResultByCode(params,  
  4.   
  5.                      paramValues,method));  
  6.   
  7.        Elementroot = doc.getRootElement();  
  8.   
  9.        Elementrn = root.element("s"); // 节点名  
  10.   
  11.        System.out.println(rn.getData());  
  12.   
  13.        return (String)rn.getData();  
  14.   
  15. catch(DocumentException e) {  
  16.   
  17.        // TODOAuto-generated catch block  
  18.   
  19.        e.printStackTrace();  
  20.   
  21.        System.out.println("解析出错!");  
  22.   
  23.        return"解析出错!";  
  24.   
  25. }  


         这一步就是我们通过dom4j来解析我们所需要的数据了。这个就不详细介绍了。

 

         到这一步之后我们就通过java成功调用了webservice。其实不是非常困难,主要还是原理上明白怎么个处理流程。

 

         希望通过这两篇博客的整理,大家能够会使用axis2创建webservice和利用axis2调用webservice!


0 0
原创粉丝点击