前面介绍的几种存储都是将数据存储在本地设备上,除此之外,还有一种存储(获取)数据的方式,通过网络来实现数据的存储和获取,下面看一个在Android上调用WebService的例子。
注意?在Android的早期版本中,曾经支持过进行XMPP Service和Web Service的远程访问。Android SDK 1.0以后的版本对它以前的API作了许多的变更。Android 1.0以上版本不再支持XMPP Service,而且访问Web Service的API全部变更。
1.例子介绍
通过邮政编码查询该地区的天气预报,以POST发送的方式发送请求到webservicex.net站点,访问WebService.webservicex.net站点上提供查询天气预报的服务,具体信息请参考其WSDL文档,网址为:
http://www.webservicex.net/WeatherForecast.asmx?WSDL。
输入:美国某个城市的邮政编码。
输出:该邮政编码对应城市的天气预报。
2.实现步骤如下
(1)如果需要访问外部网络,则需要在AndroidManifest.xml文件中加入如下代码申请权限许可:
- <!--?Permissions?--> ?
- <uses-permission?Android:name="Android.permission.INTERNET"?/>?
(2)以HTTP POST的方式发送(注意:SERVER_URL并不是指WSDL的URL,而是服务本身的URL)。实现的代码如下所示:
- private?static?final?String?SERVER_URL?=?"http://www.webservicex.net/WeatherForecast.?asmx/GetWeatherByZipCode";?//定义需要获取的内容来源地址 ?
- HttpPost?request?=?new?HttpPost(SERVER_URL);?//根据内容来源地址创建一个Http请求 ?
- //?添加一个变量 ?
- List?<NameValuePair>?params?=?new?ArrayList?<NameValuePair>(); ?
- //?设置一个华盛顿区号 ?
- params.add(new?BasicNameValuePair("ZipCode",?"200120"));??//添加必须的参数 ?
- request.setEntity(new?UrlEncodedFormEntity(params,?HTTP.UTF_8));?//设置参数的编码 ?
- try?{ ?
- HttpResponse?httpResponse?=?new?DefaultHttpClient().execute(request);?//发送请求并获取反馈 ?
- //?解析返回的内容 ?
- if(httpResponse.getStatusLine().getStatusCode()?!=?404) ?
- { ?
- ??String?result?=?EntityUtils.toString(httpResponse.getEntity()); ?
- ??Log.d(LOG_TAG,?result); ?
- } ?
- }?catch?(Exception?e)?{ ?
- Log.e(LOG_TAG,?e.getMessage()); ?
- }?
代码解释:
如上代码使用Http从webservicex获取ZipCode为"200120"(美国WASHINGTON D.C)的内容,其返回的内容如下:
- <WeatherForecasts?xmlns:xsd="http://www.w3.org/2001/XMLSchema"?xmlns:xsi="http:?//www.w3.org/2001/XMLSchema-instance"?xmlns="http://www.webservicex.net"> ?
- ??<Latitude>38.97571</Latitude> ?
- ??<Longitude>77.02825</Longitude> ?
- ??<AllocationFactor>0.024849</AllocationFactor> ?
- ??<FipsCode>11</FipsCode> ?
- ??<PlaceName>WASHINGTON</PlaceName> ?
- ??<StateCode>DC</StateCode> ?
- ??<Details> ?
- ????<WeatherData> ?
- ??????<Day>Saturday,?April?25,?2009</Day> ?
- ??????<WeatherImage>http://forecast.weather.gov/images/wtf/sct.jpg</WeatherImage> ?
- ??????<MaxTemperatureF>88</MaxTemperatureF> ?
- ??????<MinTemperatureF>57</MinTemperatureF> ?
- ??????<MaxTemperatureC>31</MaxTemperatureC> ?
- ??????<MinTemperatureC>14</MinTemperatureC> ?
- ????</WeatherData> ?
- ????<WeatherData> ?
- ??????<Day>Sunday,?April?26,?2009</Day> ?
- ??????<WeatherImage>http://forecast.weather.gov/images/wtf/few.jpg</WeatherImage> ?
- ??????<MaxTemperatureF>89</MaxTemperatureF> ?
- ??????<MinTemperatureF>60</MinTemperatureF> ?
- ??????<MaxTemperatureC>32</MaxTemperatureC> ?
- ??????<MinTemperatureC>16</MinTemperatureC> ?
- ????</WeatherData> ?
- … ?
- ??</Details> ?
- </WeatherForecasts>?
这个例子演示了如何在Android中通过网络获取数据,掌握该类内容,开发者需要熟悉java.net.*,Android.net.*这两个包的内容,在这就不赘述了,请读者参阅相关文档。
?