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

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;

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

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

(0)

相关推荐

  • Android开发调用WebService的方法示例

    本文实例讲述了Android开发调用WebService的方法.分享给大家供大家参考,具体如下: WebService是一种基于SOAP协议的远程调用标准,通过webservice可以将不同操作系统平台.不同语言.不同技术整合到一块.在Android SDK中并没有提供调用WebService的库,因此,需要使用第三方的SDK来调用WebService.PC版本的WEbservice客户端库非常丰富,例如Axis2,CXF等,但这些开发包对于Android系统过于庞大,也未必很容易移植到Andr

  • 在Android中调用WebService实例

    某些情况下我们可能需要与Mysql或者Oracle数据库进行数据交互,有些朋友的第一反应就是直接在Android中加载驱动然后进行数据的增删改查.我个人不推荐这种做法,一是手机毕竟不是电脑,操作大量数据费时费电:二是流量贵如金那.我个人比较推荐的做法是使用Java或PHP等开发接口或者编写WebService进行数据库的增删该查,然后Android调用接口或者WebService进行数据的交互.本文就给大家讲解在Android中如何调用远程服务器端提供的WebService. 既然是调用WebS

  • Android ksoap调用webservice批量上传多张图片详解

    Android ksoap调用webservice批量上传多张图片详解 这几天一直在开发app,哎呀,什么都是第一接触,想想自己自学Java,然后自学Android,一直没有放弃,曾想放弃的,但是想到爸妈供我上学,不能在宿舍里面玩游戏,加入学校实验室,一天没课就来着里学习,当然这里也有志同道合的人,一起努力一起进步!虽然大学这几年都在努力的学习技术,也没有参加什么活动的,更别说找个女伴了!还是老老实实的敲代码,成功给我带来巨大的潜能,新技术总是吸引着我.自己做项目,哎呀!好像说偏题了,言归正传吧

  • 在Android中访问WebService接口的方法

    需要引入ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar 复制代码 代码如下: //WebService的命名空间 static final String namespace = "http://impl.service.suncreate.com"; //服务器发布的url static final String url = http://10.100.3.41/axis2/services/UploadService;

  • Android 通过webservice上传多张图片到指定服务器详解

    Android 通过webservice上传多张图片到指定服务器详解 当你浏览这个的时候相信你对webservice的基本应用已经有一定的了解了,若是还没有明白的小伙伴,可以看我前面写的文章点击打开链接,这几天在开发一款app,需要上传图片到指定服务器吧,但是我刚开始以为在网上面应该有这样的好文章的吧,结果我在网络上找了好多代码,在传递图片的过程中,遇到各种bug,真是国人的东西就是喜欢复制别人的,自己不动手检验一下代码的正确性,哎,我也是无语了,然后我决定花点时间来填补一下这个空缺,写了这一片

  • android调用WebService实例分析

    本文实例讲述了android调用WebService的方法.分享给大家供大家参考.具体如下: WebService是一种基于SOAP协议的远程调用标准,通过webservice可以将不同操作系统平台.不同语言.不同技术整合到一块.在Android SDK中并没有提供调用WebService的库,因此,需要使用第三方的SDK来调用WebService.PC版本的WEbservice客户端库非常丰富,例如Axis2,CXF等,但这些开发包对于Android系统过于庞大,也未必很容易移植到Androi

  • Android 中利用 ksoap2 调用 WebService的示例代码

    去年刚刚工作的时候,第一个项目是要访问 WebService.由于没有接触过,查了很多资料,在别人代码的基础上稍微修改了一下,总算满足了自己的需求.最近整理电脑的时候,发现了这个 WebService 的访问类,怕哪一天需要的时候找不到了,干脆写在博客上吧,也给需要的人提供一个参考. 1.下载 ksoap2 的 jar 文件 下载地址:ksoap2-android-assembly-3.6.1-jar-with-dependencies.jar 下载完成后依赖到自己的项目中即可. 2.封装网络访

  • Android通过Webservice操作sqlserver数据库实例代码

    首页在AndroidManifest.xml中添加访问数据库权限 <uses-sdk android:minSdkVersion="7" /> <uses-permission android:name="android.permission.INTERNET" /> 在src中新建一个连接webservice的类,名字随意,这里叫做"HttpConnSoap".基本上这个类是固定的,要改的大多数就是webservice端

  • android中soap协议使用(ksoap调用webservice)

    如下面代码所示: 复制代码 代码如下: SoapObject request  = new SoapObject(serviceNamespace, methodName); SoapObject构造函数的两个参数含义为: serviceNamespace – 你的webservice的命名空间,既可以是 http://localhost:8088/flickrBuddy/services/Buddycast这样的,也可以是 urn:PI/DevCentral/SoapService这样的: m

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

    Android通过ksoap2传递复杂数据类型及CXF发布的webservice详细介绍 最近在学校搞点东西,搞了2天的webservice,心累呀,今天中午和小伙伴终于弄通了,感觉就是一些细节问题没有注意到,啊,我的时间呀,进这么过去了,为了不让小伙伴们走弯路,我还是认真的把开发文档写一遍吧! 首先,如果我们要用CXF发布webservice用自定义类型的对象来当参数传递的话,我们应该先把这个类序列化一遍,下面就是我测试的代码,我创建了一个TGrade类,实现了KvmSerializable接

  • Android Intent传递对象的两种方法(Serializable,Parcelable)详细介绍

    Android Intent传递对象的两种方法(Serializable,Parcelable)详细介绍 今天要给大家讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是Bundle.putParcelable(Key, Object);当然这些Object是有一定的条件的,前者是实现了Serializable接口,而后者是实现了Parcelable接口,为了让大家更容易理解我还是照常写

  • Android跨进程传递大数据的方法实现

    最近要从Service端给Client端传递图片数据,之前的数据都是通过aidl传递: 创建 Parcelable文件 ImageData.java public class ImageData implements Parcelable { private byte[] data; public byte[] getData() { return data; } public ImageData(byte[] dataIn) { this.data = dataIn; } public Ima

  • Android Intent传递数据底层分析详细介绍

    Android  Intent传递数据底层分析详细介绍 我们知道在Activity切换时,如果需要向下一个ActivityB传递数据,可以借助Intent对象的putExtra方法. 但是不知各位有没有想过这样一个问题:ActivityB中获取到的对象跟上一个Activity中的那个对象有什么关系? 换句话说就是,我在ActivityB中通过Intent获取的对象跟ActivityA中的那个对象,有没有可能是同一个对象? 按照常理来说,博主提出一个设想后续的就是证明过程了,但是我要遗憾的告诉你,

  • Android WebView交互传递json字符串并解析的方法

    前言 我们大家都知道WebView交互中可以传递基本数据类型的数据值,比如常用的int,String. 但是WebView也可以传递一种很重要很常用的数据格式-json数据. 传递json和传递String数据是一样的,关键就是HTML5端对json数据通过eval()函数进行解析 传递过程中android端调用的最重要的一个函数就是: addJavascriptInterface(new MyObject(this,"dd"),"my"); 这个函数有两个参数,第

  • Android  Intent传递数据底层分析详细介绍

    Android  Intent传递数据底层分析详细介绍 我们知道在Activity切换时,如果需要向下一个ActivityB传递数据,可以借助Intent对象的putExtra方法. 但是不知各位有没有想过这样一个问题:ActivityB中获取到的对象跟上一个Activity中的那个对象有什么关系? 换句话说就是,我在ActivityB中通过Intent获取的对象跟ActivityA中的那个对象,有没有可能是同一个对象? 按照常理来说,博主提出一个设想后续的就是证明过程了,但是我要遗憾的告诉你,

  • android中intent传递list或者对象的方法

    本文实例讲述了android中intent传递list或者对象的方法.分享给大家供大家参考.具体实现方法如下: 方法一: 如果单纯的传递List<String> 或者List<Integer>的话 就可以直接使用 代码如下: 复制代码 代码如下: intent.putStringArrayListExtra(name, value)  intent.putIntegerArrayListExtra(name, value) 方法二: 如果传递的是List<Object>

  • Android中Intent传递对象的两种方法Serializable,Parcelable

    Android中的传递有两个方法,一个是Serializable,另一个是Parcelable. Serializable是J2SE本身就支持的.而Parcelable是Android所特有的. 二者的使用场景和区别: 1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable. 2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC. 3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelab

  • Android 通过Intent使用Bundle传递对象详细介绍

    Android 通过Intent使用Bundle传递对象 Android开发中有时需要在应用中或进程间传递对象,下面详细介绍Intent使用Bundle传递对象的方法. 被传递的对象需要先实现序列化,而序列化对象有两种方式:java.io.Serializable和android.os.Parcelable Java中使用的是Serializable,而谷歌在Android使用了自定义的Parcelable. 两种序列化方式的区别: 1.在使用内存的时候,Parcelable比Serializa

  • 关于Android Activity之间传递数据的6种方式

    使用Inten的putExtra传递 第一个Activity中 //创建意图对象 Intent intent = new Intent(this,TwoActivity.class); //设置传递键值对 intent.putExtra("data",str); //激活意图 startActivity(intent); 第二个Activity中 // 获取意图对象 Intent intent = getIntent(); //获取传递的值 String str = intent.ge

随机推荐