国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android通過ksoap2傳遞復雜數據類型及CXF發布的webservice詳細介紹

2019-12-12 03:38:02
字體:
來源:轉載
供稿:網友

 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; 

上面是我親手寫的代碼,若是沒有明白小伙伴,給我留言我給你看看吧,注意請求網絡不能放在主線程哦,不然要報錯的

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永福县| 峨边| 仁化县| 武城县| 西安市| 新密市| 靖远县| 荔波县| 德阳市| 镇原县| 章丘市| 准格尔旗| 民县| 金门县| 乐平市| 岳池县| 宁安市| 沧源| 花莲县| 霍城县| 麟游县| 韶山市| 秦皇岛市| 容城县| 黄山市| 临沭县| 通海县| 喀喇| 长春市| 锡林郭勒盟| 丰原市| 威海市| 成安县| 离岛区| 乌兰浩特市| 临漳县| 山阴县| 喀什市| 安西县| 柳州市| 钦州市|