1. 程式人生 > >轉:axis客戶端接收不同引數型別

轉: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,

     javax.xml.rpc.ParameterMode.IN);//介面的引數    call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);// 設定返回型別  簡單型別的返回就可以這樣簡單操作,只要設定返回型別即可。甚至可以不設定返回型別。不設定返回型別操作方法請看2    Object xml;    try {     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     e.printStackTrace();    }

    } 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為傳入引數的變數名 字            call.addParameter(new QName("hoope.views.api.login_service.LoginService",            "pwd"),XMLType.SOAP_STRING,ParameterMode.IN);//這裡的units為傳入引數的變數名字            call.addParameter(new QName("hoope.views.api.login_service.LoginService",            "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) {           e.printStackTrace();       }

4。返回自定義陣列物件

返回陣列物件與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為傳入引數的變數名 字            call.addParameter(new QName("hoope.views.api.login_service.LoginService",            "pwd"),XMLType.SOAP_STRING,ParameterMode.IN);//這裡的units為傳入引數的變數名字            call.addParameter(new QName("hoope.views.api.login_service.LoginService",            "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});//介面接收的引數               System.out.println("xljg="+itv);//列印輸出陣列     } catch (ServiceException e) {           e.printStackTrace();       } catch (RemoteException e) {           e.printStackTrace();       }   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為傳入引數的變數名字                                call.addParameter( new QName( " hoope.views.api.userinfo_service.UserInfoWebService " ,                 " type " ),XMLType.SOAP_INT,ParameterMode.IN); // 這裡的type為傳入引數的變數名字                                call.addParameter( new QName( " hoope.views.api.userinfo_service.UserInfoWebService " ,                 " start " ),XMLType.SOAP_INT,ParameterMode.IN); // 這裡的start為傳入引數的變數名字                                call.addParameter( new QName( " hoope.views.api.userinfo_service.UserInfoWebService " ,                 " pagesize " ),XMLType.SOAP_INT,ParameterMode.IN); // 這裡的pagesize為傳入引數的變數名字                                call.addParameter( new QName( " hoope.views.api.userinfo_service.UserInfoWebService " ,                 " 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) {                e.printStackTrace();            }   ---------------------  作者:xiechunmei13  來源:CSDN  原文:https://blog.csdn.net/xiechunmei13/article/details/5656843  版權宣告:本文為博主原創文章,轉載請附上博文連結!