【android studio】Android通过ksoap2传递复杂数据类型及CXF发布的webservice详细介绍

时间:2021-06-29  来源:WebService  阅读:

最近在学校搞点东西,搞了2天的webservice,心累呀,今天中午和小伙伴终于弄通了,感觉就是一些细节问题没有注意到,啊,我的时间呀,进这么过去了,为了不让小伙伴们走弯路,我还是认真的把开发文档写一遍吧!

首先,如果我们要用CXF发布webservice用自定义类型的对象来当参数传递的话,我们应该先把这个类序列化一遍,下面就是我测试的代码,我创建了一个TGrade类,实现了KvmSerializable接口,这个接口里面的三个方法,这个接口的好处在于不需要服务端在去反序列化实体对象了,

 

 代码如下

publicclassTGradeimplementsKvmSerializable {

  

  // Fields

  

  privateInteger GId;

  privateInteger GMax;

  privateInteger GMin;

  privateString GName;

  privateString GPic;

  privateString GType;

    

  // Constructors

  /** default constructor */

  publicTGrade() {

  }

  

  /** minimal constructor */

  publicTGrade(Integer GMax) {

    this.GMax = GMax;

  }

  

  /** full constructor */

  publicTGrade(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

  publicInteger getGId() {

    returnthis.GId;

  }

  

  publicvoidsetGId(Integer GId) {

    this.GId = GId;

  }

  

  publicInteger getGMax() {

    returnthis.GMax;

  }

  

  publicvoidsetGMax(Integer GMax) {

    this.GMax = GMax;

  }

  

  publicInteger getGMin() {

    returnthis.GMin;

  }

  

  publicvoidsetGMin(Integer GMin) {

    this.GMin = GMin;

  }

  

  publicString getGName() {

    returnthis.GName;

  }

  

  publicvoidsetGName(String GName) {

    this.GName = GName;

  }

  

  publicString getGPic() {

    returnthis.GPic;

  }

  

  publicvoidsetGPic(String GPic) {

    this.GPic = GPic;

  }

  

  publicString getGType() {

    returnthis.GType;

  }

  

  publicvoidsetGType(String GType) {

    this.GType = GType;

  }

  

  @Override

  publicObject getProperty(intarg0) {

    switch(arg0) { 

    case0: 

      returnGId; 

    case1: 

      returnGMax; 

    case2: 

      returnGMin; 

    case3: 

      returnGName; 

    case4: 

      returnGPic;

    case5: 

      returnGType; 

    default: 

      break; 

    } 

    returnnull; 

  }

  

  @Override

  publicintgetPropertyCount() {

    // TODO Auto-generated method stub

    return6;//y要注意这里,必须等于参数的个数,不然服务端没有办法接受有些参数

  }

  

  @Override

  publicvoidgetPropertyInfo(intarg0, Hashtable arg1, PropertyInfo arg2) {

    switch(arg0) {

    case0: 

      arg2.type = PropertyInfo.STRING_CLASS; 

      arg2.name ="GId"; 

      break; 

    case1: 

      arg2.type = PropertyInfo.STRING_CLASS; 

      arg2.name ="GMax"; 

      break; 

    case2: 

      arg2.type = PropertyInfo.STRING_CLASS; 

      arg2.name ="GMin"; 

      break; 

    case3: 

      arg2.type = PropertyInfo.STRING_CLASS; 

      arg2.name ="GName"; 

      break; 

    case4: 

      arg2.type = PropertyInfo.STRING_CLASS; 

      arg2.name ="GPic"; 

      break; 

    case5: 

      arg2.type = PropertyInfo.STRING_CLASS; 

      arg2.name ="GType"; 

      break; 

    default: 

      break; 

    }    

  }

  

  @Override

  publicvoidsetProperty(intarg0, Object arg1) {

    switch(arg0) {

    case0:

      GId=Integer.parseInt(arg1.toString());

      break;

    case1:

      GMax=Integer.parseInt(arg1.toString());

  

      break;

    case2:

      GMin=Integer.parseInt(arg1.toString());

  

      break;

    case3:

      GName=arg1.toString();

  

      break;

    case4:

      GPic=arg1.toString();

  

      break;

    case5:

  

      GType=arg1.toString();

      break;

  

    default:

      break;

    }

  }

  

  

  

}

  

//-----------------------------下面是我测试部分的代码,这部分代码很重要,需要认真的看,我也写的比较详细,代码的世界模糊不得

  

publicbooleanaddMaintenanceInfo() {

    String methodName ="addGrade";//服务端的方法

    String soapAction =“http://10.127.80.67/gbckf/Android/GradeService”+methodName;

      

    TGrade person =newTGrade();

    person.setProperty(0,"6");

    person.setProperty(1,1);

    person.setProperty(3,"1");

    person.setProperty(4,"1");

    person.setProperty(5,"1");

    // 建立webservice连接对象

    HttpTransportSE transport =newHttpTransportSE(AgbcApi.GRADESERVICEURL,5000);//5秒超时

    transport.debug =true;// 是否是调试模式

    // 设置连接参数

    SoapObject soapObject =newSoapObject(AgbcApi.NAMESPACE, methodName);

    PropertyInfo objekt =newPropertyInfo();

    objekt.setName("arg0");//这个arg0很重要,不能是其他的东西,只能是arg0,不要问我为何,不然你就永远接受不了参数,因为是xml文档类型的东西

    objekt.setValue(person);

    objekt.setType(TGrade.class);

    soapObject.addProperty(objekt);

    // 设置返回参数

    SoapSerializationEnvelope envelope =newSoapSerializationEnvelope(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中指定的,

      (newMarshalBase64()).register(envelope);

      try{

      transport.call(soapAction, envelope);

      if(envelope.bodyIninstanceofSoapFault){

        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();

    }

  

    returntrue;

 

【android studio】Android通过ksoap2传递复杂数据类型及CXF发布的webservice详细介绍

http://m.bbyears.com/asp/126679.html

推荐访问:
相关阅读 猜你喜欢
本类排行 本类最新