# 7.4 Android 调用 WebService
## 本节引言:
> 经过前面的学习,数据请求,数据解析,文件上传下载等,应该满足大家与服务器交互的基本 需求了,而本节给大家介绍的Android调用WebService,其实这玩意有点类似于一些给我们提供 原始数据API服务的数据平台,比如聚合数据!而WebService则用到了XML和SOAP,通过HTTP协议 即可完成与远程机器的交互!嗯,不多说,开始本节内容~
## 1.WebService简介
![](http://www.runoob.com/wp-content/uploads/2015/09/29885464.jpg)
PS:如果看完上面简介还不是很清楚的话,那么就算了,之前公司就用C#搭的一个WebService! 本节我们并不讨论如何去搭建一个WebService,我们仅仅知道如何去获取WebService提供的服务, 然后解析返回的XML数据,然后把相关数据显示到我们的Android设备上就好!
## 2.去哪里获取WebService服务
网上有很多提供WebService的站点,首先找到这些站点,然后获取相应的服务即可! 这里选取WebXml和云聚36wu作为例子给大家讲解下,他们的官网:
**webXml**:[http://www.webxml.com.cn/zh_cn/index.aspx](http://www.webxml.com.cn/zh_cn/index.aspx)
> 以前是免费的,不过都商业化了,很多服务都要收费,但是可以试用~ 改站点上提供了16个不同的Web服务,可以根据自己的需求,查询相应服务,调用不同的接口!
**webXml的相关页面**:
![](http://www.runoob.com/wp-content/uploads/2015/09/14506413.jpg)
**相关使用次数说明**:
![](http://www.runoob.com/wp-content/uploads/2015/09/24990554.jpg)
**云聚36wu**:[http://www.36wu.com/Service](http://www.36wu.com/Service)
> 同样也提供了很多的服务,很多手机的app都是用的这里的接口,比如彩虹公交,手机天气等 不过,这个也是要收费的=-=,可以试用,不过只能一小时内发送20次请求; 点击申请使用,获得key就可以了!两者随便选一个吧!
![](http://www.runoob.com/wp-content/uploads/2015/09/2918446.jpg)
## 3.第三方jar包的准备
> 首先如果想在Android平台上调用WebService需要依赖于第三方类库:ksoap2 而在Android平台上,使用的是ksoap2 Android,一个高效,轻量级的SOAP开发包!
>
> jar包下载地址:[https://code.google.com/p/ksoap2-android/wiki/HowToUse?tm=2](https://code.google.com/p/ksoap2-android/wiki/HowToUse?tm=2)
>
> 天朝可能上不去,这里提供两个百度云的链接供大家下载使用:
>
> **2.54版本**:[ksoap2-android 2.54.jar](/try/download/ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar)
>
> **3.30版本**:[ksoap2-android 3.30.jar](/try/download/ksoap2-android-assembly-3.3.0-jar-with-dependencies.jar)
>
> 如果所幸你能进入jar包的下载地址的话,那么你会看到下面的界面:
>
> ![](http://www.runoob.com/wp-content/uploads/2015/09/67390549.jpg)
>
> ![](http://www.runoob.com/wp-content/uploads/2015/09/14715990.jpg)
## 4.获取相关的一些参数
> 首先找到我们需要获取的服务,然后记录相关的参数: **NameSpace**(命名空间),**SoapAction**以及**URL**就不用说了,其他参数这样找:
>
> ![](http://www.runoob.com/wp-content/uploads/2015/09/77830142.jpg)
>
> **比如我们这里找的是天气的查询参数,点进去我们可以看到这样一个参数文档:**
>
> ![](http://www.runoob.com/wp-content/uploads/2015/09/4860400.jpg)
>
> **比如这里我们需要的是天气查询部分的功能:**
>
> ![](http://www.runoob.com/wp-content/uploads/2015/09/96394953.jpg)
>
> 先把框住的SoapAction和NameSpace拷贝下来!当然我们可以在这个页面测试,另外 我们是免费用户,id可以不填直接跳过,输入后点击调用按钮会打开这样一个页面:
>
> ![](http://www.runoob.com/wp-content/uploads/2015/09/49499402.jpg)
>
> 嘿嘿,这里就是返回的XML,而我们要做的也就是解析这样一个XML,另外这里的 .gif代表的是天气图标!
同理,我们再把归属地查询的看下SoapAction,NameSpace以及相关参数mark下!
![](http://www.runoob.com/wp-content/uploads/2015/09/96494147.jpg)
**以及返回后的XML数据**:
![](http://www.runoob.com/wp-content/uploads/2015/09/30595401.jpg)
## 5.注册并启用相关WEB服务
![](http://www.runoob.com/wp-content/uploads/2015/09/93886000.jpg)
![](http://www.runoob.com/wp-content/uploads/2015/09/81129909.jpg)
点击我的Web服务器,然后点击试用,WebXML给我们提供了五天的免费试用, 我们把需要的两个服务器开启!
![](http://www.runoob.com/wp-content/uploads/2015/09/61530107.jpg)
好的,记得mark下我们自己的key哦~
## 6.调用WebService的代码示例
嗯,接下来我们来写代码验证调用WebService的流程:
**运行效果图**:
![](http://www.runoob.com/wp-content/uploads/2015/09/67585998.jpg)
PS:这个号码是以前的号码=-=,别尝试拨打,已经换人了~ 另外天气服务好像有写问题,有时并不能获取到,估计是WebXml做的一些限制, 毕竟试用...
**实现代码**:
```
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText edit_param;
private Button btn_attribution;
private Button btn_weather;
private TextView txt_result;
private String city;
private String number;
private String result;
//定义获取手机信息的SoapAction与命名空间,作为常量
private static final String AddressnameSpace = "http://WebXml.com.cn/";
//天气查询相关参数
private static final String Weatherurl = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx";
private static final String Weathermethod = "getWeather";
private static final String WeathersoapAction = "http://WebXml.com.cn/getWeather";
//归属地查询相关参数
private static final String Addressurl = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";
private static final String Addressmethod = "getMobileCodeInfo";
private static final String AddresssoapAction = "http://WebXml.com.cn/getMobileCodeInfo";
//定义一个Handler用来更新页面:
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 0x001:
txt_result.setText("结果显示:\n" + result);
Toast.makeText(MainActivity.this, "获取天气信息成功", Toast.LENGTH_SHORT).show();
break;
case 0x002:
txt_result.setText("结果显示:\n" + result);
Toast.makeText(MainActivity.this, "号码归属地查询成功", Toast.LENGTH_SHORT).show();
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindViews();
}
private void bindViews() {
edit_param = (EditText) findViewById(R.id.edit_param);
btn_attribution = (Button) findViewById(R.id.btn_attribution);
btn_weather = (Button) findViewById(R.id.btn_weather);
txt_result = (TextView) findViewById(R.id.txt_result);
btn_attribution.setOnClickListener(this);
btn_weather.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_weather:
new Thread() {
@Override
public void run() {
getWether();
}
}.start();
break;
case R.id.btn_attribution:
new Thread(new Runnable() {
public void run() {
getland();
}
}).start();
break;
}
}
//定义一个获取某城市天气信息的方法:
public void getWether() {
result = "";
SoapObject soapObject = new SoapObject(AddressnameSpace, Weathermethod);
soapObject.addProperty("theCityCode:", edit_param.getText().toString());
soapObject.addProperty("theUserID", "dbdf1580476240458784992289892b87");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = soapObject;
envelope.dotNet = true;
envelope.setOutputSoapObject(soapObject);
HttpTransportSE httpTransportSE = new HttpTransportSE(Weatherurl);
System.out.println("天气服务设置完毕,准备开启服务");
try {
httpTransportSE.call(WeathersoapAction, envelope);
// System.out.println("调用WebService服务成功");
} catch (Exception e) {
e.printStackTrace();
// System.out.println("调用WebService服务失败");
}
//获得服务返回的数据,并且开始解析
SoapObject object = (SoapObject) envelope.bodyIn;
System.out.println("获得服务数据");
result = object.getProperty(1).toString();
handler.sendEmptyMessage(0x001);
System.out.println("发送完毕,textview显示天气信息");
}
//定义一个获取号码归属地的方法:
public void getland() {
result = "";
SoapObject soapObject = new SoapObject(AddressnameSpace, Addressmethod);
soapObject.addProperty("mobileCode", edit_param.getText().toString());
soapObject.addProperty("userid", "dbdf1580476240458784992289892b87");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = soapObject;
envelope.dotNet = true;
envelope.setOutputSoapObject(soapObject);
HttpTransportSE httpTransportSE = new HttpTransportSE(Addressurl);
// System.out.println("号码信息设置完毕,准备开启服务");
try {
httpTransportSE.call(AddresssoapAction, envelope);
//System.out.println("调用WebService服务成功");
} catch (Exception e) {
e.printStackTrace();
//System.out.println("调用WebService服务失败");
}
//获得服务返回的数据,并且开始解析
SoapObject object = (SoapObject) envelope.bodyIn;//System.out.println("获得服务数据");
result = object.getProperty(0).toString();//System.out.println("获取信息完毕,向主线程发信息");
handler.sendEmptyMessage(0x001);
//System.out.println("发送完毕,textview显示天气信息");
}
}
```
另外,别忘了导包和Internet的权限!
```
<uses-permission android:name="android.permission.INTERNET"/>
```
## 参考代码下载:
**WebServiceDemo.zip**:[下载 WebServiceDemo.zip](/try/download/WebServiceDemo.zip)
## 本节小结:
> 好的,本节关于Android端如何去使用这个WebService就讲解到这里,下一节我们来学习一个 类似于浏览器的Android控件——WebView,敬请期待~谢谢~!
- 1.0 Android基础入门教程
- 1.0.1 2015年最新Android基础入门教程目录
- 1.1 背景相关与系统架构分析
- 1.2 开发环境搭建
- 1.2.1 使用Eclipse + ADT + SDK开发Android APP
- 1.2.2 使用Android Studio开发Android APP
- 1.3 SDK更新不了问题解决
- 1.4 Genymotion模拟器安装
- 1.5.1 Git使用教程之本地仓库的基本操作
- 1.5.2 Git之使用GitHub搭建远程仓库
- 1.6 .9(九妹)图片怎么玩
- 1.7 界面原型设计
- 1.8 工程相关解析(各种文件,资源访问)
- 1.9 Android程序签名打包
- 1.11 反编译APK获取代码&资源
- 2.1 View与ViewGroup的概念
- 2.2.1 LinearLayout(线性布局)
- 2.2.2 RelativeLayout(相对布局)
- 2.2.3 TableLayout(表格布局)
- 2.2.4 FrameLayout(帧布局)
- 2.2.5 GridLayout(网格布局)
- 2.2.6 AbsoluteLayout(绝对布局)
- 2.3.1 TextView(文本框)详解
- 2.3.2 EditText(输入框)详解
- 2.3.3 Button(按钮)与ImageButton(图像按钮)
- 2.3.4 ImageView(图像视图)
- 2.3.5.RadioButton(单选按钮)&Checkbox(复选框)
- 2.3.6 开关按钮ToggleButton和开关Switch
- 2.3.7 ProgressBar(进度条)
- 2.3.8 SeekBar(拖动条)
- 2.3.9 RatingBar(星级评分条)
- 2.4.1 ScrollView(滚动条)
- 2.4.2 Date & Time组件(上)
- 2.4.3 Date & Time组件(下)
- 2.4.4 Adapter基础讲解
- 2.4.5 ListView简单实用
- 2.4.6 BaseAdapter优化
- 2.4.7ListView的焦点问题
- 2.4.8 ListView之checkbox错位问题解决
- 2.4.9 ListView的数据更新问题
- 2.5.0 构建一个可复用的自定义BaseAdapter
- 2.5.1 ListView Item多布局的实现
- 2.5.2 GridView(网格视图)的基本使用
- 2.5.3 Spinner(列表选项框)的基本使用
- 2.5.4 AutoCompleteTextView(自动完成文本框)的基本使用
- 2.5.5 ExpandableListView(可折叠列表)的基本使用
- 2.5.6 ViewFlipper(翻转视图)的基本使用
- 2.5.7 Toast(吐司)的基本使用
- 2.5.8 Notification(状态栏通知)详解
- 2.5.9 AlertDialog(对话框)详解
- 2.6.0 其他几种常用对话框基本使用
- 2.6.1 PopupWindow(悬浮框)的基本使用
- 2.6.2 菜单(Menu)
- 2.6.3 ViewPager的简单使用
- 2.6.4 DrawerLayout(官方侧滑菜单)的简单使用
- 3.1.1 基于监听的事件处理机制
- 3.2 基于回调的事件处理机制
- 3.3 Handler消息传递机制浅析
- 3.4 TouchListener PK OnTouchEvent + 多点触碰
- 3.5 监听EditText的内容变化
- 3.6 响应系统设置的事件(Configuration类)
- 3.7 AnsyncTask异步任务
- 3.8 Gestures(手势)
- 4.1.1 Activity初学乍练
- 4.1.2 Activity初窥门径
- 4.1.3 Activity登堂入室
- 4.2.1 Service初涉
- 4.2.2 Service进阶
- 4.2.3 Service精通
- 4.3.1 BroadcastReceiver牛刀小试
- 4.3.2 BroadcastReceiver庖丁解牛
- 4.4.2 ContentProvider再探——Document Provider
- 4.5.1 Intent的基本使用
- 4.5.2 Intent之复杂数据的传递
- 5.1 Fragment基本概述
- 5.2.1 Fragment实例精讲——底部导航栏的实现(方法1)
- 5.2.2 Fragment实例精讲——底部导航栏的实现(方法2)
- 5.2.3 Fragment实例精讲——底部导航栏的实现(方法3)
- 5.2.4 Fragment实例精讲——底部导航栏+ViewPager滑动切换页面
- 5.2.5 Fragment实例精讲——新闻(购物)类App列表Fragment的简单实现
- 6.1 数据存储与访问之——文件存储读写
- 6.2 数据存储与访问之——SharedPreferences保存用户偏好参数
- 6.3.1 数据存储与访问之——初见SQLite数据库
- 6.3.2 数据存储与访问之——又见SQLite数据库
- 7.1.1 Android网络编程要学的东西与Http协议学习
- 7.1.2 Android Http请求头与响应头的学习
- 7.1.3 Android HTTP请求方式:HttpURLConnection
- 7.1.4 Android HTTP请求方式:HttpClient
- 7.2.1 Android XML数据解析
- 7.2.2 Android JSON数据解析
- 7.3.1 Android 文件上传
- 7.3.2 Android 文件下载(1)
- 7.3.3 Android 文件下载(2)
- 7.4 Android 调用 WebService
- 7.5.1 WebView(网页视图)基本用法
- 7.5.2 WebView和JavaScrip交互基础
- 7.5.3 Android 4.4后WebView的一些注意事项
- 7.5.4 WebView文件下载
- 7.5.5 WebView缓存问题
- 7.5.6 WebView处理网页返回的错误码信息
- 7.6.1 Socket学习网络基础准备
- 7.6.2 基于TCP协议的Socket通信(1)
- 7.6.3 基于TCP协议的Socket通信(2)
- 7.6.4 基于UDP协议的Socket通信
- 8.1.1 Android中的13种Drawable小结 Part 1
- 8.1.2 Android中的13种Drawable小结 Part 2
- 8.1.3 Android中的13种Drawable小结 Part 3
- 8.2.1 Bitmap(位图)全解析 Part 1
- 8.2.2 Bitmap引起的OOM问题
- 8.3.1 三个绘图工具类详解
- 8.3.2 绘图类实战示例
- 8.3.3 Paint API之—— MaskFilter(面具)
- 8.3.4 Paint API之—— Xfermode与PorterDuff详解(一)
- 8.3.5 Paint API之—— Xfermode与PorterDuff详解(二)
- 8.3.6 Paint API之—— Xfermode与PorterDuff详解(三)
- 8.3.7 Paint API之—— Xfermode与PorterDuff详解(四)
- 8.3.8 Paint API之—— Xfermode与PorterDuff详解(五)
- 8.3.9 Paint API之—— ColorFilter(颜色过滤器)(1/3)
- 8.3.10 Paint API之—— ColorFilter(颜色过滤器)(2-3)
- 8.3.11 Paint API之—— ColorFilter(颜色过滤器)(3-3)
- 8.3.12 Paint API之—— PathEffect(路径效果)
- 8.3.13 Paint API之—— Shader(图像渲染)
- 8.3.14 Paint几个枚举/常量值以及ShadowLayer阴影效果
- 8.3.15 Paint API之——Typeface(字型)
- 8.3.16 Canvas API详解(Part 1)
- 8.3.17 Canvas API详解(Part 2)剪切方法合集
- 8.3.18 Canvas API详解(Part 3)Matrix和drawBitmapMash
- 8.4.1 Android动画合集之帧动画
- 8.4.2 Android动画合集之补间动画
- 8.4.3 Android动画合集之属性动画-初见
- 8.4.4 Android动画合集之属性动画-又见
- 9.1 使用SoundPool播放音效(Duang~)
- 9.2 MediaPlayer播放音频与视频
- 9.3 使用Camera拍照
- 9.4 使用MediaRecord录音
- 10.1 TelephonyManager(电话管理器)
- 10.2 SmsManager(短信管理器)
- 10.3 AudioManager(音频管理器)
- 10.4 Vibrator(振动器)
- 10.5 AlarmManager(闹钟服务)
- 10.6 PowerManager(电源服务)
- 10.7 WindowManager(窗口管理服务)
- 10.8 LayoutInflater(布局服务)
- 10.9 WallpaperManager(壁纸管理器)
- 10.10 传感器专题(1)——相关介绍
- 10.11 传感器专题(2)——方向传感器
- 10.12 传感器专题(3)——加速度/陀螺仪传感器
- 10.12 传感器专题(4)——其他传感器了解
- 10.14 Android GPS初涉
- 11.0《2015最新Android基础入门教程》完结散花~