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(); 
         }  
   -----------------------------------------------------望對學習者有所幫 助------------------------------------------------------------------

相關推薦

轉:axis客戶接收不同引數型別

axis只支援簡單型別的返回值。在這裡逐一介紹axis的各種返回值接受。 1:axis接受基本型別,如int ,string等 引入的系統檔案: import javax.xml.namespace.QName; import javax.xml.rpc.Paramet

axis客戶接收不同引數型別

axis只支援簡單型別的返回值。在這裡逐一介紹axis的各種返回值接受。 1:axis接受基本型別,如int ,string等 引入的系統檔案: import javax.xml.namespace.QName; import javax.xml.rpc.Parameter

oracle服務客戶字符集不同導致中文亂碼解決方案

use 修改環境變量 描述 image nls_lang oracle服務 環境 分析 導致 1.問題描述 用pl/sql登錄時,會提示“數據庫字符集(ZHS16GBK)和客戶端字符集(2%)是不同的,字符集轉化可能會造成不可預期的後果”,具體問題是中文亂碼,如下圖 2.

9.3 客戶接收響應信息(異步轉同步的實現)

value ack hashmap 等待 nal rem illegal nec eth 一 總體流程 客戶端接收響應消息 NettyHandler.messageReceived(ChannelHandlerContext ctx, MessageEvent e) --

java在線聊天項目0.9版 實現把服務接收到的信息返回給每一個客戶窗口中顯示功能之客戶接收

nec 一個 out for tex ava 添加 implement com 客戶端要不斷接收服務端發來的信息 與服務端不斷接收客戶端發來信息相同,使用線程的方法,在線程中循環接收 客戶端修改後代碼如下: package com.swift; import java.

同一個hdfs客戶 切換不同叢集環境

是通過兩個配置檔案來切換到不同叢集環境的, hdfs-site.xml和core-site.xml   現在我建立兩個目錄: ~/dev/hadoop 開發環境目錄 ~/prod/hadoop 產品環境目錄 好了,現在我把開發環境叢集的core-site.xml和h

Spring MVC前傳遞和後接收引數名不一致處理方式

前端傳遞的變數和後端接收的變數名字不一致時,用註解@RequestParam來實現資料的傳遞 例如:@RequestParam(value="id")  //實現商品的分類目錄展現 /** * value="實現資料的傳遞" * defaultValue:如果引數為null時生效 * requi

SQL注入筆記02:基於不同引數型別的注入

數字型 $id=$_GET['x'] Select * from news where id=$id 如:?x=1->Select * from news where id=1 注入更改:無 字

C#寫客戶接收mjpg-streamer視訊流

最近用wpf做一個樹莓派機器人的綜合控制端,需要解析機器人攝像頭的視訊流,樹莓派是用mjpg-streamer呼叫並搭建了視訊流服務。 客戶端解析mjpg-streamer視訊幀的原理是:建立Http長連線,每次接收1024長度的資料,資料流中包含資料頭資訊和緊跟在資料頭資

java通過cxf實現webservice服務客戶接收不到響應資訊處理方法

最近在做專案時與客戶進行webservice聯調,響應成功後返回1,服務端正常返回,客戶端表示沒有收到,針對其中的問題分析和處理方法。 1.判斷是否是服務寫的有問題,寫了個測試方式試了下,發現服務端返回沒有問題 String xmlStr = "<?xml vers

Springmvc controller接收請求引數型別

轉載地址:http://18810098265.iteye.com/blog/2380269 第一種情況:資料是基本型別或者String1, 直接用表單提交,引數名稱相同即可; Controller引數定義為陣列型別即可.不要定義為List<String> 

對伺服器與客戶編碼不同的解決方式2

使用IO流來確保編碼正確 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,

socket的連線(三次握手)和關閉過程(四次握手)與伺服器各種關閉對客戶不同影響

之前對socket的TIME_WAIT看的很迷糊,今天在這裡總結下,以備今後檢視: socket的連線(三次握手)和關閉過程(四次握手): socket狀態變遷圖: 伺服器和客戶端各種狀態總結: CLOSED:沒有使用該套接字 LISTEND:套接字正在監聽連線 SYN

Oracle資料庫字符集和客戶字符集不同,強制轉化可能會造成不可預期的後果

1. NLS_LANG 引數組成 NLS_LANG引數由以下部分組成: NLS_LANG=<Language>_<Territory>.<Clients Characterset> NLS_LANG各部分含義如下: LANGUAGE指定: -Oracle訊息使用的語言

WSAAsyncSelect模型 實現socket客戶接收資料的例子

(1) h檔案中宣告網路事件響應函式 afx_msg void OnNetEvent(WPARAM wParam, LPARAM lParam);  (2)cpp檔案中把NETWORK_EVENT事件對映到OnNetEvent()函式 BEGIN_MESSAGE_MAP(C

ServerSocket和Socket建立通訊(客戶傳送訊息伺服器接收並返回到客戶接收輸出)

需求:客戶端傳送訊息到伺服器,伺服器接收到訊息並讀取輸出,然後寫出到客戶端客戶端接收到輸出。 1、建立伺服器端      |-伺服器建立通訊ServerSocket      |-伺服器建立Socket接收客戶端連線      |-建立IO輸入流讀取客戶端傳送的資料    

RTSP客戶接收H264的RTP包並解析遇到的問題

關於RTSP怎麼握手,RTP包和H264的格式網上已經很多了,我就不贅述了。只說一下在做這個客戶端的時候遇到的問題。說明下,我的客戶端程式碼是從ffmpeg裡面提取出來的。 1、傳送PLAY命令後,服務端抓包顯示已經在發資料了,但是客戶端似乎沒收到資料。  經過仔細檢查後

android客戶傳遞複雜引數給webservice

1.Webservice開發 Webservice由wcf開發完成,我不懂,大概說一下會用到哪些。就在下圖中,解釋一下下圖,是伺服器自動生成的,通過URL(http://192.168.13.95:8086/UIServices)在瀏覽器中開啟是這樣的,程式中用到的就是UR

Android基於XMPP Smack Openfire開發IM【三】客戶接收伺服器傳送的訊息

Demo需求:android客戶端接收伺服器傳送來的訊息。 第一,客戶端程式碼如下: MainActivity未做改動,與之前兩篇一樣 Java程式碼   package com.example.openfiretest;   import org.jivesoftware.smack.Chat;

location.search在客戶獲取Url引數的方法

location.search是從當前URL的?號開始的字串如:http://www.baidu.com/s?wd=baidu&cl=3它的search就是?wd=baidu&cl=3 如: location.search.substr(1).split("&")[0]可以返回第一個