天天看點

axis用戶端接收不同參數類型

axis隻支援簡單類型的傳回值。在這裡逐一介紹axis的各種傳回值接受。

1:axis接受基本類型,如int ,string等

引入的系統檔案:

import javax.xml.namespace.QName;

import javax.xml.rpc.ParameterMode;

import javax.xml.rpc.ServiceException;

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

import org.apache.axis.encoding.XMLType;

import org.apache.axis.encoding.ser.BeanDeserializerFactory;

import org.apache.axis.encoding.ser.BeanSerializerFactory;

Service service = new Service();//建立service對象

  Call call;

  try {

   call = (Call) service.createCall();//得到Call對象

   try {

    call.setTargetEndpointAddress(new  java.net.URL(Constants.sns_sms_service));//将要通路的接口位址,将接口位址加上?wsdl在浏覽器中通路就可以檢視到wsdl檔案的資訊,以及你所需要的參數名稱等。

   } catch (MalformedURLException e) {

    e.printStackTrace();

   }

   call.setOperationName("sendSms");//WSDL 裡面描述的接口名稱

   call.getMessageContext().setUsername(Constants.sns_httpbase_username);//http 認證使用者名

   call.getMessageContext().setPassword(Constants.sns_httpbase_password);//http 認證密碼

   call.addParameter("sendnum", org.apache.axis.encoding.XMLType.XSD_STRING,

     javax.xml.rpc.ParameterMode.IN);//接口的參數 sendnum 為String類型。addParameter()第一個參數是參數的名稱與wsdl中相對應必須相同。第二個參數是參數的類型 。也必須與wsdl相同。

   call.addParameter("acceptnums", org.apache.axis.encoding.XMLType.XSD_STRING,

     javax.xml.rpc.ParameterMode.IN);//接口的參數

   call.addParameter("smscnt", org.apache.axis.encoding.XMLType.XSD_STRING,

   call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);// 設定傳回類型  簡單類型的傳回就可以這樣簡單操作,隻要設定傳回類型即可。甚至可以不設定傳回類型。不設定傳回類型操作方法請看2

   Object xml;

    xml = (Object)call.invoke(new Object[]{send,reving,content});//參數的順序與addParameter的順序相同,且設定了 addParmaters就必須setRuturnType傳回值

    //給方法傳遞參數,并且調用方法

    System.out.println("result is "+xml);

   } catch (RemoteException e) {

    // TODO Auto-generated catch block

  } catch (ServiceException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

2.不設定傳回類型的簡單類型傳回值。

Service和Call的建立都與1相同。

call = (Call) service.createCall();

  call.setOperationName(new QName(url, "getIByusername"));//getByusername是服務端接口的方法名稱url是接口位址

  call.setTargetEndpointAddress(new java.net.URL(url));//接口位址

  Object o =  call.invoke(new Object[] { account ,IP, mcode });//這裡直接傳入參數,但是需要注意的是,傳入的參數順序必須與wsdl順序相同,且類型相同。可以接收一個map的對象。

3.。傳回值為自定義對象

try{

  String url = Constants.sns_login_service; 

     Service service = new Service(); 

        Call call = (Call) service.createCall(); 

        call.setTargetEndpointAddress(url); 

        call.setOperationName(new QName(url, "Login"));//Login為要調用的方法名 

    // hoope.views.api.login_service.LoginService為 wsdl中 targetNamespace 的值 以下相同

         call.addParameter(new QName("hoope.views.api.login_service.LoginService", 

         "username"),XMLType.SOAP_STRING,ParameterMode.IN);//這裡的username為傳入參數的變量名字 

         "pwd"),XMLType.SOAP_STRING,ParameterMode.IN);//這裡的units為傳入參數的變量名字 

         "code"),XMLType.SOAP_STRING,ParameterMode.IN);//這裡的code為傳入參數的變量名字 

         call.setReturnType(new QName("hoope.views.api.login_service.LoginService", 

        "response"), ITVAccount.class);//ITVAccount這裡是重點,傳回時主要在這配置,ITVAccount為傳回的對象 

        // 注冊映射關系 

        QName XljgInfo = new QName("hoope.views.api.login_service.LoginService", "LoginInfoDict");//此處的 LoginInfoDict為WSDL檔案中complexType name的屬性值 

//這裡注冊映射關系,對自定義的類進行序列化與反序列化。

        call.registerTypeMapping(ITVAccount.class, XljgInfo, 

                new BeanSerializerFactory(ITVAccount.class, XljgInfo), 

                new BeanDeserializerFactory(ITVAccount.class, XljgInfo));//ITVAccount.class同上,

        ITVAccount itv =(ITVAccount) call.invoke(new Object[] {account,pwd,code});//接口接收的參數

        if(itv!=null){

         itv.setNickName(itv.getNickname());

         itv.setUserName(itv.getUsername());

         itv.setMobilePhone(itv.getUserphone());

        }

        System.out.println("xljg="+itv);//列印輸出對象

  } catch (ServiceException e) { 

        e.printStackTrace(); 

    } catch (RemoteException e) { 

    }

4。傳回自定義數組對象

傳回數組對象與3相似,隻要将注冊傳回類型為數組即可。

        "response"), ITVAccount[].class );//ITVAccount 這裡是重點,傳回時主要在這配置,ITVAccount為傳回數組對象 

        call.registerTypeMapping(ITVAccount[].class , XljgInfo, 

                new BeanSerializerFactory(ITVAccount[]. class, XljgInfo), 

                new BeanDeserializerFactory(ITVAccount[]. class, XljgInfo));//ITVAccount.class同上,

        ITVAccount[] itv =(ITVAccount[]) call.invoke(new Object[] {account,pwd,code});//接口接收的參數

              System.out.println("xljg="+itv);//列印輸出數組 

    } 

5。傳回值為對象中包含對象及對象中包含數組

 try {  

             Service service = new Service(); 

             Call call = (Call) service.createCall(); 

             call.setTargetEndpointAddress(url); 

             call.setOperationName( new QName(url, " seachRelateUserInfo " )); // seachRelateUserInfo為要調用的方法名 

             call.getMessageContext().setUsername( " admin " ); // httpbase認證使用者名

             call.getMessageContext().setPassword( " admin " ); // httpbase認證密碼

             // hoope.views.api.userinfo_service.UserInfoWebService  為 wsdl中 targetNamespace 的值 以下相同

              call.addParameter( new QName( " hoope.views.api.userinfo_service.UserInfoWebService " , 

              " condition " ),XMLType.SOAP_STRING,ParameterMode.IN); // 這裡的condition為傳入參數的變量名字 

              " type " ),XMLType.SOAP_INT,ParameterMode.IN); // 這裡的type為傳入參數的變量名字 

              " start " ),XMLType.SOAP_INT,ParameterMode.IN); // 這裡的start為傳入參數的變量名字 

              " pagesize " ),XMLType.SOAP_INT,ParameterMode.IN); // 這裡的pagesize為傳入參數的變量名字 

              " checkcode " ),XMLType.SOAP_STRING,ParameterMode.IN); // 這裡的checkcode為傳入參數的變量名字 

              call.setReturnType( new QName( " hoope.views.api.userinfo_service.UserInfoWebService " , 

              " response " ), MapInfoDict. class ); // 這裡設定傳回值的類型

           // 注冊映射關系   // 此處的MapInfoDict userInfoDictArray userInfoDict為WSDL檔案中complexType name的屬性值  首先找到傳回對象的complexType再看它中是否有其他的對象類型自定義對象類型,然後依次映射。

              // 這裡傳回對象的complexType為MapInfoDict,MapInfoDict中有一個userInfoDictArray的對象,userInfoDictArray的對象中有一個List<UserInfoDict>的集合。

              // 問題就在這裡,這個集合擷取不到。

             QName XljgInfo = new QName( " hoope.views.api.userinfo_service.UserInfoWebService " , " MapInfoDict " );

             QName XljgInfo2 = new QName( " hoope.views.api.userinfo_service.UserInfoWebService " , " userInfoDictArray " );

             QName XljgInfo3 = new QName( " hoope.views.api.userinfo_service.UserInfoWebService " , " userInfoDict " );

           // 為自定義類型進行序列化和反序列化。必須與上面定義的QName比對。它與服務端傳回的類型做映射比對。

             call.registerTypeMapping(MapInfoDict. class , XljgInfo, 

                     new BeanSerializerFactory(MapInfoDict. class , XljgInfo), 

                     new BeanDeserializerFactory(MapInfoDict. class , XljgInfo));

             call.registerTypeMapping(UserInfoDictArray. class , XljgInfo2, 

                     new BeanSerializerFactory(UserInfoDictArray. class , XljgInfo2), 

                     new BeanDeserializerFactory(UserInfoDictArray. class , XljgInfo2));

//對 UserInfoDictArray中存在的是對象,則直接對對象進行序列化與反序列話即可。但如果UserInfoDictArray中的是List該如何去映射呢?該如何序列化呢?還沒找到實作方法。待解決中。。。望高人指點。

call.registerTypeMapping(UserInfoDict. class , XljgInfo3, 

                     new BeanSerializerFactory(UserInfoDict. class , XljgInfo3), 

                     new BeanDeserializerFactory(UserInfoDict. class , XljgInfo3));[ / color]

             MapInfoDict xljg = (MapInfoDict) call.invoke( new Object[] {parm, " 1 " , " 1 " , " 20 " , " itv " }); // 執行調用服務接口

System.out.println( " xljg= " + xljg); // 列印輸出

         } catch (ServiceException e) { 

             e.printStackTrace(); 

         } catch (RemoteException e) { 

         }