在Android应用开发中有太多的地方应用到WebService的调用。
WebService
技术,能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。
依据
WebService
规范实施的应用之间,无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。
WebService
是自描述、自包含的可用网络模块, 可以执行具体的业务功能。
WebService
也很容易部署,因为它们基于一些常规的产业标准以及已有的一些技术,诸如
XML
和
HTTP
。
WebService
减少了应用接口的花费。
WebService
为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。
在WebService中广泛应用到的技术:
TCP/IP:通用网络协议,被各种设备使用HTML: 通用用户界面,可以使用 HTML 标签显示数据Java :写一次可以在任何系统运行的通用编程语言,因为 java 具有跨平台特性XML :通用数据表达语言,在 web 上传送结构化数据的容易方法他们 的特点是其开放性,跨平台性,开放性正是 Webservices 的基础。
WebService
平台需要一套协议来实现分布式应用程序的创建。任何平台都有它的数据表示方法和类型系统。要实现互操作性,
WebService
平台必须提供一套标准的类型系统,用于沟通不同平台、编程语言和组件模型中的不同类型系统。目前这些协议有:XML和XSD、SOAP、WSDL、UDDI。
XML
和
XSD
可扩展的标记语言
XML
,是
WebService
平台中表示数据的基本格式。除了易于建立和易于分析外,
XML
主要的优点在于它既与平台无关,又与厂商无关。
XML
是由万维网协会
(W3C)
创建,
W3C
制定的
XML
SchemaXSD
定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。
WebService
平台是用
XSD
来作为数据类型系统的。当你用某种语言如
VB.NET
或
C#
来构造一个
WebService
时,为了符合
WebService
标准,所有你使用的数据类型都必须被转换为
XSD
类型。如想让它使用在不同平台和不同软件的不同组织间传递,还需要用某种东西将它包装起来。这种东西就是一种协议,如
SOAP
。
SOAP
SOAP
即简单对象访问协议
(SimpleObject Access Protocol)
,它是用于交换
XML
编码信息的轻量级协议。它有三个主要方面:
XML-envelope
为描述信息内容和如何处理内容定义了框架,将程序对象编码成为
XML
对象的规则,执行远程过程调用
(RPC)
的约定。
SOAP
可以运行在任何其他传输协议上。例如,你可以使用
SMTP
,即因特网电子邮件协议来传递
SOAP
消息,这可是很有诱惑力的。在传输层之间的头是不同的,但
XML
有效负载保持相同。
WebService
希望实现不同的系统之间能够用“软件
-
软件对话”的方式相互调用,打破了软件应用、网站和各种设备之间的格格不入的状态,实现“基于
Web
无缝集成”的目标。
WSDL
WebService
描述语言
WSDL
就是用机器能阅读的方式提供的一个正式描述文档而基于
XML
的语言,用于描述
WebService
及其函数、参数和返回值。因为是基于
XML
的,所以
WSDL
既是机器可阅读的,又是人可阅读的。
UDDI
UDDI
的目的是为电子商务建立标准;
UDDI
是一套基于
Web
的、分布式的、为
WebService
提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的
WebService
注册,以使别的企业能够发现的访问协议的实现标准。
在AndroidSDK中并没有提供调用WebService的库,因此,需要使用第三方的SDK来调用WebService。
PC版本的WEbservice客户端库非常丰富,例如Axis2,CXF等,但这些开发包对于Android系统过于庞大,也未必很容易移植到Android系统中。
因此,这些开发包并不是在我们的考虑范围内。适合手机的WebService客户端的SDK有一些,比较常用的有Ksoap2,可以从http://code.google.com/p/ksoap2-android/downloads/list进行下载;将下载的ksoap2-android-assembly-2.4-jar-with-dependencies.jar包复制到Eclipse工程的lib目录中,当然也可以放在其他的目录里。同时在Eclipse工程中引用这个jar包。
具体调用调用
webservice
的方法为:
(
1
)指定
webservice
的命名空间和调用的方法名,如:
SoapObject
request =new
SoapObject
(http://service,”
getName
”);
SoapObject
类的第一个参数表示
WebService
的命名空间,可以从
WSDL
文档中找到
WebService
的命名空间。第二个参数表示要调用的
WebService
方法名。
(
2
)设置调用方法的参数值,如果没有参数,可以省略,设置方法的参数值的代码如下:
Request.addProperty
(“param1”,”value”);
Request.addProperty
(“param2”,”value”);
要注意的是,
addProperty
方法的第
1
个参数虽然表示调用方法的参数名,但该参数值并不一定与服务端的
WebService
类中的方法参数名一致,只要设置参数的顺序一致即可。
(
3
)生成调用
Webservice
方法的
SOAP
请求信息。该信息由
SoapSerializationEnvelope
对象描述,代码为:
SoapSerializationEnvelope
envelope=new
SoapSerializationEnvelope
(SoapEnvelope.VER11);
Envelope.bodyOut
= request;
创建
SoapSerializationEnvelope
对象时需要通过
SoapSerializationEnvelope
类的构造方法设置
SOAP
协议的版本号。该版本号需要根据服务端
WebService
的版本号设置。在创建
SoapSerializationEnvelope
对象后,不要忘了设置
SOAPSoapSerializationEnvelope
类的
bodyOut
属性,该属性的值就是在第一步创建的
SoapObject
对象。
(
4
)创建
HttpTransportsSE
对象。通过
HttpTransportsSE
类的构造方法可以指定
WebService
的
WSDL
文档的
URL
:
HttpTransportSEht=newHttpTransportSE(“http://192.168.18.17:80/axis2/service/SearchNewsService?wsdl”);
(5)
使用
call
方法调用
WebService
方法,代码:
ht.call
(
null
,
envelope
);
Call
方法的第一个参数一般为
null
,第
2
个参数就是在第
3
步创建的
SoapSerializationEnvelope
对象。
(
6
)使用
getResponse
方法获得
WebService
方法的返回结果,代码:
SoapObject
soapObject
=(
SoapObject
)
envelope.getResponse
();