基于Soap协议的android客户端和服务器的数据交互(学习天气预报例子的心得)
Webservice 是一种基于Soap协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合到一起.
在PC机java客户端,需要用一些库来访问webservice,可以用Ksoap第三方
的类库来获取服务器端webService的调用.
首先
下载Ksoap包:ksoap2-android-assembly-3.0.0-RC.4-jar-with-dependencies.jar
下载链接:
//实例化SoapObject soapObject=new SoapObject(targetNameSpace, getWeatherbyCityName);//传入参数soapObject.addProperty(参数名, 参数值);soapObject.addProperty("theCityName", city);
/************建议webservice的方法传递的参数尽量用string类型。即使是int类型,kSOAP2与Java编写的webservice也有可能交互发生异常.**************/
3 设置SOAP请求信息,把构造好的soapObject封装进去,设置好属性后,再发出请求(参数部分为SOAP协议版本号,与webservice版本号一致)
SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.bodyOut=soapObject; envelope.dotNet=true; envelope.setOutputSoapObject(soapObject); /* * 注意:这个属性是对dotnetwebservice协议的支持, * 如果dotnet的webservice 不指定rpc方式则用true否则要用false */
/*****************
常量SoapEnvelope.VER10:对应于SOAP1.0规范
常量SoapEnvelope.VER11:对应于SOAP1.1规范
常量SoapEnvelope.VER12:对应于SOAP1.2规范
***********************/
/**********************
在kSOAP中,我们用Base64把二进制流编码为ASCII字符串,这样就可以通过XML/SOAP传输二进制数据了。
org.ksoap2.serialization.MarshalBase64的目的就是,把SOAP XML中的xsd:based64Binary元素序列化为Java字节数组(byete array)类型。类似的,kSOAP2还提供了MarshalDate、MarshalHashtable类来把相应的元素序列化为Java的Date、Hashtable类型。
(该步可省 据需要决定) (new MarshalBase64()).register(envelope); //注册envelope
*********************/
4 构建传输对象,开启调试信息
HttpTransportSE httpTranstation=new HttpTransportSE(WSDL); httpTranstation.debug=true;/*********如果HttpTransport的debug属性为true,那么此时就可以通过System.out.println("Response dump>>+ tx.responseDump);
/***************
对于HttpTransport的处理上,kSOAP2和kSOAP1.2的写法不一样。
kSOAP 1.2,HttpTransport的构造函数是HttpTransport (String url, String soapAction),第二个参数soapAction可以是要调用的webservice方法名。
kSOAP 2,构造函数是 HttpTransport(String url)。kSOAP2相当于把webservice方法名分离出去,完全交给SoapObject去封装,而HttpTransport仅仅负责把SoapEnvelope发送出去并接收响应,这样更合理一些。
***************/
5 调用WebService(其中参数为1:命名空间+方法名称,2:Envelope对象):
httpTranstation.call(targetNameSpace+getWeatherbyCityName, envelope);
/*************方法HttpTransport.call()自己就能够发送请求给服务器、接收服务器响应并序列化SOAP消息,如下所示:
ht.call(soapAction, envelope);
soapAction – SOAP 规范定义了一个名为 SOAPAction 的新 HTTP 标头,所有 SOAP HTTP 请求(即使是空的)都必须包含该标头。
soapAction标头旨在表明该消息的意图。通常可以置此参数为null,这样HttpTransport就会设置HTTP标头SOAPAction为空字符串。
Envelope – 就是前面我们构造好的SoapSerializationEnvelope或SoapEnvelope对象。
*************/