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

 更新时间:2017年02月24日 11:36:58   投稿:lqh  
这篇文章主要介绍了 Android通过ksoap2传递复杂数据类型详细介绍的相关资料,需要的朋友可以参考下

 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; 

上面是我亲手写的代码,若是没有明白小伙伴,给我留言我给你看看吧,注意请求网络不能放在主线程哦,不然要报错的

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • Flutter Android应用启动白屏的解决方案

    Flutter Android应用启动白屏的解决方案

    任何一个app基本都会设计一个启动页,今天我们就来看看怎么在flutter项目中设置启动页,这篇文章主要给大家介绍了关于Flutter Android应用启动白屏解决的相关资料,需要的朋友可以参考下
    2021-11-11
  • Android开发中日期工具类DateUtil完整实例

    Android开发中日期工具类DateUtil完整实例

    这篇文章主要介绍了Android开发中日期工具类DateUtil,结合完整实例形式分析了Android针对日期与时间的计算、转换、格式化、获取等相关操作技巧,需要的朋友可以参考下
    2017-11-11
  • Android中的Shape和Selector的结合使用实例

    Android中的Shape和Selector的结合使用实例

    这篇文章主要介绍了Android中的Shape和Selector的结合使用实例,本文直接给出实例代码,需要的朋友可以参考下
    2015-06-06
  • Android使用fragment实现左侧导航

    Android使用fragment实现左侧导航

    这篇文章主要为大家详细介绍了Android使用fragment实现左侧导航,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Android实现网易云音乐高仿版流程

    Android实现网易云音乐高仿版流程

    这篇文章主要介绍了Android实现网易云音乐高仿版,包含了首页复杂发现界面布局和功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Android编程实现基于BitMap获得图片像素数据的方法

    Android编程实现基于BitMap获得图片像素数据的方法

    这篇文章主要介绍了Android编程实现基于BitMap获得图片像素数据的方法,对比分析了两种获取图片像素的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • Android uses-permission权限列表中文注释版

    Android uses-permission权限列表中文注释版

    Android有一个精心设计的安全模型。每一个应用都有其自己Linux用户和群组,在单独的进程和VM上运行,不能影响到其他应用
    2014-05-05
  • Android利用绘制缓冲实现代码雨效果

    Android利用绘制缓冲实现代码雨效果

    看过很多代码雨的前端实现,却很少看到过Android代码雨效果的实现,当然 open gl es的实现是有的,一个主要的原因是,在Android Canvas绘制时,很少有人考虑使用绘制缓冲,所以本文将给大家介绍Android如何利用绘制缓冲实现代码雨效果,需要的朋友可以参考下
    2024-03-03
  • Android开发使用strings.xml多语言翻译解决方案

    Android开发使用strings.xml多语言翻译解决方案

    这篇文章主要为大家介绍了Android开发使用strings.xml多语言翻译解决方案,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • android实现支付宝咻一咻的几种思路方法

    android实现支付宝咻一咻的几种思路方法

    本篇文章主要介绍了android实现支付宝咻一咻的几种思路方法,详解的介绍了几种实现咻一咻的思路和方法,有需要的可以了解一下。
    2016-11-11

最新评论