您好,登錄后才能下訂單哦!
Android通過ksoap2傳遞復雜數據類型及CXF發布的webservice詳細介紹
最近在學校搞點東西,搞了2天的webservice,心累呀,今天中午和小伙伴終于弄通了,感覺就是一些細節問題沒有注意到,啊,我的時間呀,進這么過去了,為了不讓小伙伴們走彎路,我還是認真的把開發文檔寫一遍吧!
首先,如果我們要用CXF發布webservice用自定義類型的對象來當參數傳遞的話,我們應該先把這個類序列化一遍,下面就是我測試的代碼,我創建了一個TGrade類,實現了KvmSerializable接口,這個接口里面的三個方法,這個接口的好處在于不需要服務端在去反序列化實體對象了,
public class TGrade implements KvmSerializable { // Fields private Integer GId; private Integer GMax; private Integer GMin; private String GName; private String GPic; private String GType; // Constructors /** default constructor */ public TGrade() { } /** minimal constructor */ public TGrade(Integer GMax) { this.GMax = GMax; } /** full constructor */ public TGrade(Integer GMax, Integer GMin, String GName, String GPic, String GType) { this.GMax = GMax; this.GMin = GMin; this.GName = GName; this.GPic = GPic; this.GType = GType; } // Property accessors public Integer getGId() { return this.GId; } public void setGId(Integer GId) { this.GId = GId; } public Integer getGMax() { return this.GMax; } public void setGMax(Integer GMax) { this.GMax = GMax; } public Integer getGMin() { return this.GMin; } public void setGMin(Integer GMin) { this.GMin = GMin; } public String getGName() { return this.GName; } public void setGName(String GName) { this.GName = GName; } public String getGPic() { return this.GPic; } public void setGPic(String GPic) { this.GPic = GPic; } public String getGType() { return this.GType; } public void setGType(String GType) { this.GType = GType; } @Override public Object getProperty(int arg0) { switch (arg0) { case 0: return GId; case 1: return GMax; case 2: return GMin; case 3: return GName; case 4: return GPic; case 5: return GType; default: break; } return null; } @Override public int getPropertyCount() { // TODO Auto-generated method stub return 6;//y要注意這里,必須等于參數的個數,不然服務端沒有辦法接受有些參數 } @Override public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) { switch (arg0) { case 0: arg2.type = PropertyInfo.STRING_CLASS; arg2.name = "GId"; break; case 1: arg2.type = PropertyInfo.STRING_CLASS; arg2.name = "GMax"; break; case 2: arg2.type = PropertyInfo.STRING_CLASS; arg2.name = "GMin"; break; case 3: arg2.type = PropertyInfo.STRING_CLASS; arg2.name = "GName"; break; case 4: arg2.type = PropertyInfo.STRING_CLASS; arg2.name = "GPic"; break; case 5: arg2.type = PropertyInfo.STRING_CLASS; arg2.name = "GType"; break; default: break; } } @Override public void setProperty(int arg0, Object arg1) { switch (arg0) { case 0: GId=Integer.parseInt(arg1.toString()); break; case 1: GMax=Integer.parseInt(arg1.toString()); break; case 2: GMin=Integer.parseInt(arg1.toString()); break; case 3: GName=arg1.toString(); break; case 4: GPic=arg1.toString(); break; case 5: GType=arg1.toString(); break; default: break; } } } //-----------------------------下面是我測試部分的代碼,這部分代碼很重要,需要認真的看,我也寫的比較詳細,代碼的世界模糊不得 public boolean addMaintenanceInfo() { String methodName = "addGrade";//服務端的方法 String soapAction =“http://10.127.80.67/gbckf/Android/GradeService”+methodName; TGrade person = new TGrade(); person.setProperty(0, "6"); person.setProperty(1, 1); person.setProperty(3, "1"); person.setProperty(4, "1"); person.setProperty(5, "1"); // 建立webservice連接對象 HttpTransportSE transport = new HttpTransportSE(AgbcApi.GRADESERVICEURL,5000);//5秒超時 transport.debug = true;// 是否是調試模式 // 設置連接參數 SoapObject soapObject = new SoapObject(AgbcApi.NAMESPACE, methodName); PropertyInfo objekt = new PropertyInfo(); objekt.setName("arg0");//這個arg0很重要,不能是其他的東西,只能是arg0,不要問我為何,不然你就永遠接受不了參數,因為是xml文檔類型的東西 objekt.setValue(person); objekt.setType(TGrade.class); soapObject.addProperty(objekt); // 設置返回參數 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);// soap協議版本必須用SoapEnvelope.VER11(Soap envelope.dotNet = false;// 注意:這個屬性是對dotnetwebservice協議的支持,如果dotnet的webservice envelope.bodyOut = transport; Log.i("請求參數", soapObject.toString()); envelope.setOutputSoapObject(soapObject);// 設置請求參數 envelope.addMapping(AgbcApi.NAMESPACE, "addGrade", TGrade.class);// 傳對象時必須,參數namespace是webservice中指定的, (new MarshalBase64()).register(envelope); try { transport.call(soapAction, envelope); if(envelope.bodyIn instanceof SoapFault){ String str = ((SoapFault) envelope.bodyIn).faultstring; Log.i("空節點返回的東西", str); }else { // SoapObject sb = (SoapObject)envelope.bodyIn;//服務器返回的對象存在envelope的bodyIn中 Object obj = envelope.getResponse();// 直接將返回值強制轉換為已知對象 //Log.d("WebService", "返回結果:" + obj.toString()); } } catch (IOException e) { e.printStackTrace(); } catch (XmlPullParserException e) { e.printStackTrace(); } catch (Exception ex) { ex.printStackTrace(); } return true;
上面是我親手寫的代碼,若是沒有明白小伙伴,給我留言我給你看看吧,注意請求網絡不能放在主線程哦,不然要報錯的
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。