轉載 android 利用ksoap2方式串連webservice

來源:互聯網
上載者:User

android 利用ksoap2方式串連webservice(2010-04-16 16:36:25)轉載標籤:androidksoap2webserviceit 分類:Android
    利用J2SE的ksoap2標準,我也來做一個山寨版本的android串連webservice。因為soap封裝的關係,android application在接收到資料後不能夠正確的按照J2SE的標準來擷取。

    在運用之前,我們先要引導兩個jar進入工程的buildpath
   
    這兩個jar包都可以在網上查到下載,引導完後再做一項準備工作。弄清楚發行的webservice的地址,以及封裝的方式。比如:

webservice介面:http://192.168.0.2:8080/axis2/services/Manager?wsdl  (順便說明一下,在android當中,不能寫localhost,必須寫清楚PC機當前的網路IP)
webservice封裝:http://ws.apache.org/axis2

都瞭解了過後,說明已經做好準備了。
    下面就介紹一下android如何擷取webservice封裝資料。。

引入ksoap2中以封裝好的類
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.AndroidHttpTransport;

在類中定義webservice的介面地址以及解析方式並且定義要調用的webservice中的函數
private static final String URL = "http://192.168.0.2:8080/axis2/services/Manager?wsdl";
private static final String NAMESPACE = "http://ws.apache.org/axis2";
private static final String METHOD_NAME = "GetMyFriends";

這個資訊我們可以在webservice中查到
<xs:element name="GetMyFriends">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="userId" type="xs:int"/>
<xs:element minOccurs="0" name="password" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>

接下來開始做對webservice請求資料的工作,請求webservice函數以及封裝要用的兩個參數(userId和password)
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    request.addProperty("userId", "123456");
    request.addProperty("password", "test");
之後我們給定義發送資料的信封的封裝格式
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11 );
發出請求
envelope.setOutputSoapObject(request);
AndroidHttpTransport aht = new AndroidHttpTransport(URL);
aht.call(null, envelope);

接著就可以定義一個SoapObject類型的執行個體去擷取我們返回來的資料
SoapObject so = (SoapObject) envelope.bodyIn;
這裡如果是返回來的資料只有一行並且只有一個值,比如驗證函式,返回boolean類型的話,操作比較簡單,String getReturn= so.getProperty("return"); 這個getReturn就是你要擷取的值。
但是如果返回來是多行的值的話,這個方法就不行了,我們必須對返回來的資訊做一些解析。我曾試過用J2SE的標準方式來擷取,但是會報錯,最主要的可能是他的方式在android當中不能使用。所以在這裡我用了Regex這種方式來進行資料的解析,我們先來看一下他返回的資料的結構是什麼情況。
GetMyFriendsResponse{return=FriendsMessage{
permitList=anyType{nickName=我愛羅; singnature=null; userId=2; }; permitList=anyType{nickName=jack; singnature=null; userId=1004; }; permitList=anyType{nickName=admin; singnature=leo_admin; userId=1001; };};}
簡單看他很想Json結構,但是確不是。。。
就目前的解決方式,我只是通過規律來進行了Regex的解析:如解析上面的內容。

            //首先取得permitList(好友)的個數
            String testPattern = "permitList";
            int resultlength = result.length();
            cresult = cresult.replace(testPattern, "");
            int lastlength = (resultlength - cresult.length()) / testPattern.length();
          
            //取得每個permitList中的值。
            String LoginReturn="", pattern="nickName=.*?;\\s*singnature=.*?;\\s*userId=.*?;";
            //動態產生String 數組,儲存每個好友的資訊
            String[] GetFinalReturn = new String[lastlength];
            for (int i=0;i<lastlength;i++){
                LoginReturn = result.replaceFirst("^.*("+pattern+").*$", "$1");
                GetFinalReturn[i] = LoginReturn;
                result = result.replace(LoginReturn,"");
            }
這個數組裡面儲存的格式就是nickName=admin; singnature=leo_admin; userId=1001;
這樣以來,我們可以根據"="和";"兩個符號之間做split操作就可以得到資料。

好了,到此串連webservice和解析返回來的資料的工作就做完了,雖然這個方式看起來很複雜,但是目前來說,用ksoap2方式來串連webservice暫時還沒有找到更有效解決方式。。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.