WebService使用实例
近期刚刚開始学习使用WebService的方法进行server端数据交互,发现网上的资料不是非常全,
眼下就结合收集到的一些资料做了一个小样例和大家分享一下~
我们在PC机器javaclient中。须要一些库,比方XFire,Axis2,CXF等等来支持訪问WebService,可是这些库并不适合我们资源有限的android手机client,做过JAVA
ME的人都知道有KSOAP这个第三方的类库。能够帮助我们获取server端webService调用,当然KSOAP已经提供了基于android版本号的jar包了。那么我们就開始吧:
首先下载KSOAP包:ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar包
下载地址 点击进入代码下载
然后新建android项目:并把下载的KSOAP包放在android项目的lib文件夹下:右键->build
path->configure build path--选择Libraries。如图:
同一时候,仅仅加入jar包肯能是不够的,须要加入class folder,即能够再project的libs目录中加入下载的KSOAP包,如图:
环境配好之后能够用以下七个步骤来调用WebService方法:
第一:实例化SoapObject对象。指定webService的命名空间(从相关WSDL文档中能够查看命名空间),以及调用方法名称。
如:
//命名空间
privatestatic final String serviceNameSpace="http://WebXml.com.cn/";
//调用方法(获得支持的城市)
privatestatic final String getSupportCity="getSupportCity";
//实例化SoapObject对象
SoapObject request=new SoapObject(serviceNameSpace, getSupportCity);
第二步:如果方法有參数的话,设置调用方法參数:
request.addProperty("參数名称","參数值");
第三步:设置SOAP请求信息(參数部分为SOAP协议版本,与你要调用的webService中版本一致):
//获得序列化的Envelope
SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut=request;
第四步:注冊Envelope:
(new MarshalBase64()).register(envelope);
第五步:构建传输对象,并指明WSDL文档URL:
//请求URL
privatestatic final String serviceURL="http://www.webxml.com.cn/webservices/weatherwebservice.asmx";
//Android传输对象
AndroidHttpTransport transport=new AndroidHttpTransport(serviceURL);
transport.debug=true;
:Envelope对象):
transport.call(serviceNameSpace+getWeatherbyCityName, envelope);
第七步:解析返回数据:
if(envelope.getResponse()!=null){
return parse(envelope.bodyIn.toString());
}
这里有个地址提供webService天气预报的服务站点。在浏览器中输入站点:http://www.webxml.com.cn/webservices/weatherwebservice.asmx能够看到该站点提供的
调用方法,点进去之后能够看到调用时须要输入的參数,当然有的不须要參数,比如:getSupportProvince 。而 op=getSupportCity" style="color:rgb(202,0,0); text-decoration:none">getSupportCity
获得本天气预报Web Service支持的洲,国内外省份和城市信息:
- public class MainActivity extends Activity {
- // WSDL文档中的命名空间
- private static final String targetNameSpace = "http://WebXml.com.cn/";
- // WSDL文档中的URL
- private static final String WSDL = "http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl";
- // 须要调用的方法名(获得本天气预报Web Services支持的洲、国内外省份和城市信息)
- private static final String getSupportProvince = "getSupportProvince";
- private List<Map<String,String>> listItems;
- private ListView mListView;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- listItems = new ArrayList<Map<String,String>>();
- mListView = (ListView) findViewById(R.id.province_list);
- new NetAsyncTask().execute();
- mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?
> parent, View view,
- int position, long id) {
- String mProvinceName = listItems.get(position).get("province");
- Log.d("ProvinceName", mProvinceName);
- Intent intent = new Intent();
- intent.putExtra("Pname", mProvinceName);
- intent.setClass(MainActivity.this, CityActivity.class);
- startActivity(intent);
- }
- });
- }
- class NetAsyncTask extends AsyncTask<Object, Object, String> {
- @Override
- protected void onPostExecute(String result) {
- if (result.equals("success")) {
- //列表适配器
- SimpleAdapter simpleAdapter = new SimpleAdapter(MainActivity.this, listItems, R.layout.province_item,
- new String[] {"province"}, new int[]{R.id.province});
- mListView.setAdapter(simpleAdapter);
- }
- super.onPostExecute(result);
- }
- @Override
- protected String doInBackground(Object... params) {
- // 依据命名空间和方法得到SoapObject对象
- SoapObject soapObject = new SoapObject(targetNameSpace,
- getSupportProvince);
- // 通过SOAP1.1协议得到envelop对象
- SoapSerializationEnvelope envelop = new SoapSerializationEnvelope(
- SoapEnvelope.VER11);
- // 将soapObject对象设置为envelop对象,传出消息
- envelop.dotNet = true;
- envelop.setOutputSoapObject(soapObject);
- // 或者envelop.bodyOut = soapObject;
- HttpTransportSE httpSE = new HttpTransportSE(WSDL);
- // 開始调用远程方法
- try {
- httpSE.call(targetNameSpace + getSupportProvince, envelop);
- // 得到远程方法返回的SOAP对象
- SoapObject resultObj = (SoapObject) envelop.getResponse();
- // 得到server传回的数据
- int count = resultObj.getPropertyCount();
- for (int i = 0; i < count; i++) {
- Map<String,String> listItem = new HashMap<String, String>();
- listItem.put("province", resultObj.getProperty(i).toString());
- listItems.add(listItem);
- }
- } catch (IOException e) {
- e.printStackTrace();
- return "IOException";
- } catch (XmlPullParserException e) {
- e.printStackTrace();
- return "XmlPullParserException";
- }
- return "success";
- }
- }
- }
显示省份列表的activity_main.xml文件:
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="match_parent" >
- <ListView
- android:id="@+id/province_list"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"/>
- </LinearLayout>
列表中选项显示的province_item.xml文件:
- <?
xml version="1.0" encoding="utf-8"?
>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/province"
- android:layout_width="fill_parent"
- android:layout_height="match_parent"
- android:textSize="20sp"/>
- </LinearLayout>
效果图。如图:
查询本天气预报Web Services支持的国内外城市或地区信息:
- public class CityActivity extends Activity {
- // WSDL文档中的命名空间
- private static final String targetNameSpace = "http://WebXml.com.cn/";
- // WSDL文档中的URL
- private static final String WSDL = "http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl";
- // 须要调用的方法名(获得本天气预报Web Services支持的城市信息,依据省份查询城市集合:带參数)
- private static final String getSupportCity = "getSupportCity";
- private List<Map<String,String>> listItems;
- private ListView mListView;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- listItems = new ArrayList<Map<String,String>>();
- mListView = (ListView) findViewById(R.id.province_list);
- new NetAsyncTask().execute();
- //列表单击事件监听
- mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view,
- int position, long id) {
- String mCityName = listItems.get(position).get("city");
- String cityName = getCityName(mCityName);
- Log.d("CityName", cityName);
- Intent intent = new Intent();
- //存储选择的城市名
- intent.putExtra("Cname", cityName);
- intent.setClass(CityActivity.this, WeatherActivity.class);
- startActivity(intent);
- }
- });
- }
- /**
- * 拆分“城市 (代码)”字符串,将“城市”字符串分离
- * @param name
- * @return
- */
- public String getCityName(String name) {
- String city = "";
- int position = name.indexOf(' ');
- city = name.substring(0, position);
- return city;
- }
- class NetAsyncTask extends AsyncTask<Object, Object, String> {
- @Override
- protected void onPostExecute(String result) {
- if (result.equals("success")) {
- //列表适配器
- SimpleAdapter simpleAdapter = new SimpleAdapter(CityActivity.this, listItems, R.layout.province_item,
- new String[] {"city"}, new int[]{R.id.province});
- mListView.setAdapter(simpleAdapter);
- }
- super.onPostExecute(result);
- }
- @Override
- protected String doInBackground(Object... params) {
- // 依据命名空间和方法得到SoapObject对象
- SoapObject soapObject = new SoapObject(targetNameSpace,getSupportCity);
- //參数输入
- String name = getIntent().getExtras().getString("Pname");
- soapObject.addProperty("byProvinceName", name);
- // 通过SOAP1.1协议得到envelop对象
- SoapSerializationEnvelope envelop = new SoapSerializationEnvelope(
- SoapEnvelope.VER11);
- // 将soapObject对象设置为envelop对象,传出消息
- envelop.dotNet = true;
- envelop.setOutputSoapObject(soapObject);
- HttpTransportSE httpSE = new HttpTransportSE(WSDL);
- // 開始调用远程方法
- try {
- httpSE.call(targetNameSpace + getSupportCity, envelop);
- // 得到远程方法返回的SOAP对象
- SoapObject resultObj = (SoapObject) envelop.getResponse();
- // 得到server传回的数据
- int count = resultObj.getPropertyCount();
- for (int i = 0; i < count; i++) {
- Map<String,String> listItem = new HashMap<String, String>();
- listItem.put("city", resultObj.getProperty(i).toString());
- listItems.add(listItem);
- }
- } catch (IOException e) {
- e.printStackTrace();
- return "IOException";
- } catch (XmlPullParserException e) {
- e.printStackTrace();
- return "XmlPullParserException";
- }
- return "success";
- }
- }
- }
用于列表显示的xml反复使用,这里就不再反复写一次了,效果图。如图:
最后,依据选择的城市或地区名称获得天气情况:
- public class WeatherActivity extends Activity {
- //WSDL文档中的命名空间
- private static final String targetNameSpace="http://WebXml.com.cn/";
- //WSDL文档中的URL
- private static final String WSDL="http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl";
- //依据城市或地区名称查询获得未来三天内天气情况、如今的天气实况、天气和生活指数
- private static final String getWeatherbyCityName="getWeatherbyCityName";
- WeatherBean mWBean;
- private ImageView mImageView;
- private EditText mCityName;
- private EditText mTemp;
- private EditText mWeather;
- private TextView mToday;
- private TextView mDetail;
- private int Image[];
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.weather);
- Image = new int[]{R.drawable.image0,R.drawable.image1,R.drawable.image2,
- R.drawable.image3,R.drawable.image4,R.drawable.image5,
- R.drawable.image6,R.drawable.image7,R.drawable.image8,
- R.drawable.image9,R.drawable.image10,R.drawable.image11,
- R.drawable.image12,R.drawable.image13,R.drawable.image14,
- R.drawable.image15,R.drawable.image16,R.drawable.image17,
- R.drawable.image18,R.drawable.image19,R.drawable.image20,
- R.drawable.image21,R.drawable.image22,R.drawable.image23,
- R.drawable.image24,R.drawable.image25,R.drawable.image26,
- R.drawable.image27};
- mWBean = new WeatherBean();
- mImageView = (ImageView) findViewById(R.id.picture);
- mCityName = (EditText) findViewById(R.id.city_name);
- mTemp = (EditText) findViewById(R.id.temp);
- mWeather = (EditText) findViewById(R.id.weather);
- mToday = (TextView) findViewById(R.id.today_weather);
- mDetail = (TextView) findViewById(R.id.city_detail);
- new NetAsyncTask().execute();
- }
- class NetAsyncTask extends AsyncTask<Object, Object, String> {
- @Override
- protected void onPostExecute(String result) {
- String image = mWBean.getWeatherPicture();
- int position = getImageId(image);
- Log.d("image", Image[position]+"");
- mImageView.setImageResource(Image[position]);
- mCityName.setText(mWBean.getCityName());
- mTemp.setText(mWBean.getTemp());
- mWeather.setText(mWBean.getWeather());
- mToday.setText(mWBean.getLiveWeather());
- mDetail.setText(mWBean.getCityDetail());
- super.onPostExecute(result);
- }
- public int getImageId(String picture) {
- int id = 0;
- int tempId = picture.indexOf('.');
- String sub = picture.substring(0, tempId);
- id = Integer.parseInt(sub);
- return id;
- }
- @Override
- protected String doInBackground(Object... params) {
- // 依据命名空间和方法得到SoapObject对象
- SoapObject soapObject = new SoapObject(targetNameSpace,getWeatherbyCityName);
- String city = getIntent().getExtras().getString("Cname");
- soapObject.addProperty("theCityName",city);//调用的方法參数与參数值(依据详细须要可选可不选)
- // 通过SOAP1.1协议得到envelop对象
- SoapSerializationEnvelope envelop = new SoapSerializationEnvelope(SoapEnvelope.VER11);
- // 将soapObject对象设置为envelop对象,传出消息
- envelop.dotNet = true;
- envelop.setOutputSoapObject(soapObject);
- // 或者envelop.bodyOut = soapObject;
- HttpTransportSE httpSE = new HttpTransportSE(WSDL);
- // 開始调用远程方法
- try {
- httpSE.call(targetNameSpace + getWeatherbyCityName, envelop);
- // 得到远程方法返回的SOAP对象
- SoapObject resultObj = (SoapObject) envelop.getResponse();
- // 得到server传回的数据
- mWBean.setCityName(resultObj.getProperty(1).toString());
- mWBean.setTemp(resultObj.getProperty(5).toString());
- mWBean.setWeather(resultObj.getProperty(6).toString());
- mWBean.setWeatherPicture(resultObj.getProperty(8).toString());
- mWBean.setLiveWeather(resultObj.getProperty(10).toString());
- mWBean.setCityDetail(resultObj.getProperty(22).toString());
- } catch (IOException e) {
- e.printStackTrace();
- return "IOException";
- } catch (XmlPullParserException e) {
- e.printStackTrace();
- return "XmlPullParserException";
- }
- return "success";
- }
- }
- }
这里没有显示所有的信息,提供了一个存储部分天气信息的类:
- public class WeatherBean {
- private String CityName;
- private String Temp;
- private String Weather;
- private String WeatherPicture;
- private String LiveWeather;
- private String CityDetail;
- public String getCityName() {
- return CityName;
- }
- public void setCityName(String cityName) {
- CityName = cityName;
- }
- public String getLiveWeather() {
- return LiveWeather;
- }
- public void setLiveWeather(String liveWeather) {
- LiveWeather = liveWeather;
- }
- public String getTemp() {
- return Temp;
- }
- public void setTemp(String temp) {
- Temp = temp;
- }
- public String getWeather() {
- return Weather;
- }
- public void setWeather(String weather) {
- Weather = weather;
- }
- public String getWeatherPicture() {
- return WeatherPicture;
- }
- public void setWeatherPicture(String weatherPicture) {
- WeatherPicture = weatherPicture;
- }
- public String getCityDetail() {
- return CityDetail;
- }
- public void setCityDetail(String cityDetail) {
- CityDetail = cityDetail;
- }
- }
显示天气状况的weather.xml文件:
- <?
xml version="1.0" encoding="utf-8"?>
- <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" >
- <TableLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" >
- <TableRow>
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="天气实况:"
- android:textSize="16sp" />
- <ImageView
- android:id="@+id/picture"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- </TableRow>
- <TableRow>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="城市:"
- android:textSize="16sp" />
- <EditText
- android:id="@+id/city_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="2"
- android:hint="城市名称"
- android:editable="false" />
- </TableRow>
- <TableRow>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="温度:"
- android:textSize="16sp" />
- <EditText
- android:id="@+id/temp"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="2"
- android:hint="今日气温"
- android:editable="false" />
- </TableRow>
- <TableRow>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="天气:"
- android:textSize="16sp" />
- <EditText
- android:id="@+id/weather"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="2"
- android:hint="今日天气"
- android:editable="false" />
- </TableRow>
- </TableLayout>
- <TextView
- android:id="@+id/today_weather"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:textSize="16sp" />
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="城市简单介绍:"
- android:textSize="16sp" />
- <TextView
- android:id="@+id/city_detail"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:textSize="16sp" />
- </LinearLayout>
- </ScrollView>
效果图如图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemRfMTQ3MTI3ODY4Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="325" height="596" style="border:none; max-width:100%">
这里很多功能做得不是非常完好,大家能够依据自己的须要进行设计~
WebService使用实例的更多相关文章
- Java WebService入门实例
Web Services是由企业发布的完成其特定商务需求的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务. Web Service的关键技术和规则: 1.XML:描述 ...
- webservice测试实例
webservice测试实例(LR8.1) 接口声明:这个接口是sina的短信服务接口,我只是用来做脚本学习使用,不会对其产生压力:希望读者也只是用来进行录制学习,而不是产生压力. 接口文档:http ...
- 主题:Java WebService 简单实例
链接地址:主题:Java WebService 简单实例 http://www.iteye.com/topic/1135747 前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要 ...
- WebService入门实例教程
什么是WebService 通过使用WebService,您的应用程序可以向全世界发布信息,或提供某项功能,它是基于Web的服务,通过Web进行发布.查找和使用. WebService脚本平台需支持X ...
- VS2008中C#开发webservice简单实例
1.创建工程 文件-> 新建->网站 如下图. 工程建好后,会自动添加如下代码: using System; using System.Linq; using System.Web; us ...
- Java WebService 简单实例
前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要的重复操作. 一.准备工作(以下为本实例使用工具) 1.MyEclipse10.7.1 2.JDK 1.6.0_22 二.创建服务端 ...
- struts1+spring+myeclipse +cxf 开发webservice以及普通java应用调用webservice的实例
Cxf + Spring+ myeclipse+ cxf 进行 Webservice服务端开发 使用Cxf开发webservice的服务端项目结构 Spring配置文件applicationCont ...
- Java WebService 简单实例[转]
http://www.cnblogs.com/yisheng163/p/4524808.html?utm_source=tuicool 前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必 ...
- Java WebService简单实例
一.准备工作(以下为本实例使用工具) 1.MyEclipse10.7.1 2.JDK 1.6.0_22 二.创建服务端 1.创建[Web Service Project],命名为[TheService ...
- eclipse+webservice开发实例
1.參考文献: 1.利用Java编写简单的WebService实例 http://nopainnogain.iteye.com/blog/791525 2.Axis2与Eclipse整合开发Web ...
随机推荐
- Web安全测试-WebScarab
[功能] WebScarab是一个用来分析使用HTTP和HTTPS协议的应用程序框架.其原理很简单,WebScarab可以记录它检测到的会话内容(请求和应答),并允许使用者可以通过多种形式来查看记录. ...
- 春夏秋冬又一春之Redis持久化
历史文章推荐: 一只准程序猿的唠叨 可能是最漂亮的Spring事务管理详解 Java多线程学习(八)线程池与Executor 框架 面试中关于Redis的问题看这篇就够了 非常感谢<redis实 ...
- Android sdk安装目录中没有platform-tools目录问题详解
sdk下载地址 http://tools.android-studio.org/index.php/sdk 安装步骤很简单,百度即可. 下面详细说一下,在安装中遇到android sdk下没有plat ...
- 使用eclipse为Servlet在Tomcat中的部署方法
一:下载安装jdk,tomcat,eclipse: 使用eclipse建立动态web项目lcj,更改编译文件目录,方法如下: 右键点击→工程名称→属性(Properties)或(Building Pa ...
- spring mvc activemq
http://websystique.com/spring/spring-4-jms-activemq-example-with-jmslistener-enablejms/
- 《NodeJS开发指南》第五章微博实例开发总结
所有文章搬运自我的个人主页:sheilasun.me <NodeJS开发指南>这本书用来NodeJS入门真是太好了,而且书的附录部分还讲到了闭包.this等JavaScript常用特性.第 ...
- WebSocket原理说明
WebSocket原理说明 众所周知,Web应用的通信过程通常是客户端通过浏览器发出一个请求,服务器端接收请求后进行处理并返回结果给客户端,客户端浏览器将信息呈现.这种机制对于信息变化不是特别频繁的应 ...
- Mvc+Dapper+存储过程分页10万条数据
10万条数据采用存储过程分页实现(Mvc+Dapper+存储过程) 有时候大数据量进行查询操作的时候,查询速度很大强度上可以影响用户体验,因此自己简单写了一个demo,简单总结记录一下: 技术:Mvc ...
- Angular和Vue.js
Angular和Vue.js Vue.js 是开源的 JavaScript 框架,能够帮助开发者构建出美观的 Web 界面.当和其它网络工具配合使用时,Vue.js 的优秀功能会得到大大加强.如今,已 ...
- 【LOJ】#2551. 「JSOI2018」列队
题解 老年选手一道裸的主席树都要看好久才看出来 首先熟练的把这个区间建成\(n\)个主席树 然后对于一个询问,我们相当于在主席树上二分一个mid,使得\(mid - K + 1\)正好和\([l,r] ...