我们都知道Web Service具有使用标准协议规范、使用协约的规范性、高度集成能力、完好的封装性、松散耦合等五大特点。正是因为这样Web Service就像Web上的构件编程,开发人员通过调用Service应用编程接口,将Web Service集成进他们的应用程序,就像调用本地服务一样,同时开发人员可以跨平台和使用任何编程语言。这些优点不仅减少了开发人员的开发成本从而可以将精力投入到挖掘软件的商业价值中,同时这也是面向构件接口编程的一种很好的体现。Web Service的核心技术基于XML标准,主要包括SOAP协议、ASDL描述、UDDI协议。Web Service主要是对一些已经存在的技术进行包装,因此它是基于现有的技术的一种整合技术。这些技术均在W3c上可以学习到。
Android应用通常是运行在手机平台上,手机系统的硬件资源是有限的,不管是存储能力还是计算能力都是有限的,在Android系统上开发、运行的一些简单用户、小型用户是可能的,但是当进行大量的复杂计算时还是只能不是在远程服务器上。为了让Android应用与远程服务器之间进行交互,可以采用java的RMI技术,但这种技术要求远程服务器程序必须是java实现的,也可以采用CORBA技术,但这种技术相对复杂,因此采用Web Service是一种不错的选择。
下面以一个Android的应用来调用Web Service实现天气预报功能。
在开始之前我们必须先找到一个可以对外提供天气预报的Web Service如天气Web Service,同时也可以在该网站上下载天气预报所需要的各种图标等等。同时还得在项目中导入android-support-v4.jar和ksoap2-android-assembly-3.0.0-RC.4-jar-with-dependencies.jar两个jar包,这样才可以实现其功能。这两个jar包是Google为Android平台提供开发Web Service的。下面就是该应用的部分源码
public class WebServiceUtil
{
// 定义Web Service的命名空间
static final String SERVICE_NS = "http://WebXml.com.cn/";
// 定义Web Service提供服务的URL
static final String SERVICE_URL =
"http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx";
// 调用远程Web Service获取省份列表
public static List<String> getProvinceList()
{
// 调用的方法
final String methodName = "getRegionProvince";
// 创建HttpTransportSE传输对象
final HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
ht.debug = true;
// 使用SOAP1.1协议创建Envelop对象
final SoapSerializationEnvelope envelope =
new SoapSerializationEnvelope(SoapEnvelope.VER11);
// 实例化SoapObject对象
SoapObject soapObject = new SoapObject(SERVICE_NS, methodName);
envelope.bodyOut = soapObject;
// 设置与.Net提供的Web Service保持较好的兼容性
envelope.dotNet = true;
FutureTask<List<String>> task = new FutureTask<List<String>>(
new Callable<List<String>>()
{
@Override
public List<String> call()
throws Exception
{
// 调用Web Service
ht.call(SERVICE_NS + methodName, envelope);
if (envelope.getResponse() != null)
{
// 获取服务器响应返回的SOAP消息
SoapObject result = (SoapObject) envelope.bodyIn;
SoapObject detail = (SoapObject) result.getProperty(
methodName + "Result");
// 解析服务器响应的SOAP消息。
return parseProvinceOrCity(detail);
}
return null;
}
});
new Thread(task).start();
try
{
return task.get();
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
// 根据省份获取城市列表
public static List<String> getCityListByProvince(String province)
{
// 调用的方法
final String methodName = "getSupportCityString";
// 创建HttpTransportSE传输对