SOAP及SoapObject的解析

来源:互联网 发布:python 函数定义和调用 编辑:程序博客网 时间:2024/05/22 00:06

1 SOAP协议整合Android+Webservice

   通过http协议,采用HttpClient向服务器端action请求数据。当然调用服务器端方法获取数据并不止这一种。WebService也可以为我们提供所需数据,那么什么是webService呢?,它是一种基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合到一起。我们在Android开发pc端需要一些库,比如本次项目中用到的:ksoap2-android-assembly-2.4-jar-with-dependencies.jar库。

  2 基于SOAP协议访问WebService方法

第一:实例化SoapObject 对象,指定webService的命名空间(从相关WSDL文档中可以查看命名空间),以及调用方法名称。如:

SoapObject request=new SoapObject(“http://tempuri.org/”,”EVoucherInquriyHistory” );

  第二步:假设方法有参数的话,设置调用方法参数

                                         request.addProperty("参数名称","参数值");

   第三步:设置SOAP请求信息(参数部分为SOAP协议版本号,与你要调用的webService中版本号一致):

                               SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);

                                                      envelope.bodyOut=request;

   第四步:注册Envelope

(new MarshalBase64()).register(envelope);

  第五步:构建传输对象,并指明Web文档URL:

String serviceURL = Constants.EVOUCHER_URL; 

AndroidHttpTransport ht = new AndroidHttpTransport(serviceURL);

                                                             ht.debug = true;

 第六步:调用WebService(其中参数为1:命名空间+方法名称,2:Envelope对象)

                     ht.call(serviceNameSpace+methodName, envelope);

如:              ht.call((“http://tempuri.org/EVoucherInquriyHistory”, envelope);

 第七步:获取返回结果

                            SoapObject result = (SoapObject) envelope.bodyIn;

  3 SoapObject 解析

          SoapObject  soapChild=(SoapObject)result.getProperty(int);

          For(int i=0; i<soapChild.getPropertyCount();i++){

                    SoapObject  soapChilds=(SoapObject)result.getProperty(i);

                    String data=soapChilds.getProperty(“Key_Name”).toString();

}

SoapObject类是一个主要用于调用WCF服务的类,其对象可以作为请求,发送到WCF服务器;也可以用于存储响应信息。

该对象本身是一个存储了一套HTML语句的文本。而SoapObject本身提供了对这套HTML语句的解析。

我们对SoapObject的解析,其实可以理解为对HTML语句的解析。

本文以String类型为获取目标(即从WCF服务器提供方法返回的是String类型的数据)

首先我们把返回的String类型分成三种情况:单一个String, 一个String的数组,一个String的二维数组


①对于单一个String,我们在编写调用WCF服务的方法的时候,envelope.bodyIn就不能强制转换成SoapObject,否则会在运行时提示类型转换错误。此时envelope.bodyIn可以直接作为一个Object对象返回,也可以调用其toString()方法,即可获得想要的数据。


②对于一个String的一维数组,我们要把envelope.bodyIn强制转换成SoapObject,获取一个SoapObject类型的对象soap。

此时,只要调用SoapObject的getProperty()方法即可获得想要的数据,参数对应一维数组下标。

例如:要从返回一维数组获取第一个元素,只要调用soap.setProperty(0)即可。


③对于一个String的二维数组。

此时。通过调试发现,getProgerty()方法返回的是另一个SoapObject对象,因此我们可以把envelope.bodyIn的SoapObject对象想象成一个二维数组,其中getProperty()方法是返回一维数组的某一行,参数是对应行下标,再通过调用这一个SoapObject的getProperty()方法,即可获取某一元素。


例如:要获取String[0][1]元素,只要从envelope.bodyIn的SoapObject调用两次getProperty()方法:soap.getProperty(0).getProperty(1)

可见,只要把SoapObject抽象成一个数组,就不难去理解和解析其中的数据。


把SoapObject想象成一个数组,这个数组当中的元素可以是他自己,soapObject.setProperty(int index, Object value),此处的value也可以是一个soapObject对象
原创粉丝点击