加载中...

7.4 Android 调用 WebService


本节引言:

经过前面的学习,数据请求,数据解析,文件上传下载等,应该满足大家与服务器交互的基本 需求了,而本节给大家介绍的Android调用WebService,其实这玩意有点类似于一些给我们提供 原始数据API服务的数据平台,比如聚合数据!而WebService则用到了XML和SOAP,通过HTTP协议 即可完成与远程机器的交互!嗯,不多说,开始本节内容~

1.WebService简介

PS:如果看完上面简介还不是很清楚的话,那么就算了,之前公司就用C#搭的一个WebService! 本节我们并不讨论如何去搭建一个WebService,我们仅仅知道如何去获取WebService提供的服务, 然后解析返回的XML数据,然后把相关数据显示到我们的Android设备上就好!

2.去哪里获取WebService服务

网上有很多提供WebService的站点,首先找到这些站点,然后获取相应的服务即可! 这里选取WebXml和云聚36wu作为例子给大家讲解下,他们的官网:

webXmlhttp://www.webxml.com.cn/zh_cn/index.aspx

以前是免费的,不过都商业化了,很多服务都要收费,但是可以试用~ 改站点上提供了16个不同的Web服务,可以根据自己的需求,查询相应服务,调用不同的接口!

webXml的相关页面

相关使用次数说明:

云聚36wuhttp://www.36wu.com/Service

同样也提供了很多的服务,很多手机的app都是用的这里的接口,比如彩虹公交,手机天气等 不过,这个也是要收费的=-=,可以试用,不过只能一小时内发送20次请求; 点击申请使用,获得key就可以了!两者随便选一个吧!

3.第三方jar包的准备

首先如果想在Android平台上调用WebService需要依赖于第三方类库:ksoap2 而在Android平台上,使用的是ksoap2 Android,一个高效,轻量级的SOAP开发包!

jar包下载地址:https://code.google.com/p/ksoap2-android/wiki/HowToUse?tm=2

天朝可能上不去,这里提供两个百度云的链接供大家下载使用:

2.54版本ksoap2-android 2.54.jar

3.30版本ksoap2-android 3.30.jar

如果所幸你能进入jar包的下载地址的话,那么你会看到下面的界面:

4.获取相关的一些参数

首先找到我们需要获取的服务,然后记录相关的参数: NameSpace(命名空间),SoapAction以及URL就不用说了,其他参数这样找:

比如我们这里找的是天气的查询参数,点进去我们可以看到这样一个参数文档:

比如这里我们需要的是天气查询部分的功能:

先把框住的SoapAction和NameSpace拷贝下来!当然我们可以在这个页面测试,另外 我们是免费用户,id可以不填直接跳过,输入后点击调用按钮会打开这样一个页面:

嘿嘿,这里就是返回的XML,而我们要做的也就是解析这样一个XML,另外这里的 .gif代表的是天气图标!

同理,我们再把归属地查询的看下SoapAction,NameSpace以及相关参数mark下!

以及返回后的XML数据

5.注册并启用相关WEB服务

点击我的Web服务器,然后点击试用,WebXML给我们提供了五天的免费试用, 我们把需要的两个服务器开启!

好的,记得mark下我们自己的key哦~

6.调用WebService的代码示例

嗯,接下来我们来写代码验证调用WebService的流程:

运行效果图

PS:这个号码是以前的号码=-=,别尝试拨打,已经换人了~ 另外天气服务好像有写问题,有时并不能获取到,估计是WebXml做的一些限制, 毕竟试用...

实现代码

  1. public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  2.  
  3. private EditText edit_param;
  4. private Button btn_attribution;
  5. private Button btn_weather;
  6. private TextView txt_result;
  7.  
  8. private String city;
  9. private String number;
  10. private String result;
  11.  
  12.  
  13. //定义获取手机信息的SoapAction与命名空间,作为常量
  14. private static final String AddressnameSpace = "http://WebXml.com.cn/";
  15. //天气查询相关参数
  16. private static final String Weatherurl = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx";
  17. private static final String Weathermethod = "getWeather";
  18. private static final String WeathersoapAction = "http://WebXml.com.cn/getWeather";
  19. //归属地查询相关参数
  20. private static final String Addressurl = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";
  21. private static final String Addressmethod = "getMobileCodeInfo";
  22. private static final String AddresssoapAction = "http://WebXml.com.cn/getMobileCodeInfo";
  23.  
  24.  
  25. //定义一个Handler用来更新页面:
  26. private Handler handler = new Handler() {
  27. public void handleMessage(Message msg) {
  28. switch (msg.what) {
  29. case 0x001:
  30. txt_result.setText("结果显示:\n" + result);
  31. Toast.makeText(MainActivity.this, "获取天气信息成功", Toast.LENGTH_SHORT).show();
  32. break;
  33. case 0x002:
  34. txt_result.setText("结果显示:\n" + result);
  35. Toast.makeText(MainActivity.this, "号码归属地查询成功", Toast.LENGTH_SHORT).show();
  36. break;
  37. }
  38.  
  39. }
  40. };
  41.  
  42. @Override
  43. protected void onCreate(Bundle savedInstanceState) {
  44. super.onCreate(savedInstanceState);
  45. setContentView(R.layout.activity_main);
  46. bindViews();
  47. }
  48.  
  49. private void bindViews() {
  50. edit_param = (EditText) findViewById(R.id.edit_param);
  51. btn_attribution = (Button) findViewById(R.id.btn_attribution);
  52. btn_weather = (Button) findViewById(R.id.btn_weather);
  53. txt_result = (TextView) findViewById(R.id.txt_result);
  54. btn_attribution.setOnClickListener(this);
  55. btn_weather.setOnClickListener(this);
  56. }
  57.  
  58. @Override
  59. public void onClick(View v) {
  60. switch (v.getId()) {
  61. case R.id.btn_weather:
  62. new Thread() {
  63. @Override
  64. public void run() {
  65. getWether();
  66. }
  67. }.start();
  68. break;
  69. case R.id.btn_attribution:
  70. new Thread(new Runnable() {
  71. public void run() {
  72. getland();
  73. }
  74. }).start();
  75. break;
  76. }
  77. }
  78.  
  79.  
  80. //定义一个获取某城市天气信息的方法:
  81. public void getWether() {
  82. result = "";
  83. SoapObject soapObject = new SoapObject(AddressnameSpace, Weathermethod);
  84. soapObject.addProperty("theCityCode:", edit_param.getText().toString());
  85. soapObject.addProperty("theUserID", "dbdf1580476240458784992289892b87");
  86. SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
  87. envelope.bodyOut = soapObject;
  88. envelope.dotNet = true;
  89. envelope.setOutputSoapObject(soapObject);
  90. HttpTransportSE httpTransportSE = new HttpTransportSE(Weatherurl);
  91. System.out.println("天气服务设置完毕,准备开启服务");
  92. try {
  93. httpTransportSE.call(WeathersoapAction, envelope);
  94. // System.out.println("调用WebService服务成功");
  95. } catch (Exception e) {
  96. e.printStackTrace();
  97. // System.out.println("调用WebService服务失败");
  98. }
  99.  
  100. //获得服务返回的数据,并且开始解析
  101. SoapObject object = (SoapObject) envelope.bodyIn;
  102. System.out.println("获得服务数据");
  103. result = object.getProperty(1).toString();
  104. handler.sendEmptyMessage(0x001);
  105. System.out.println("发送完毕,textview显示天气信息");
  106. }
  107.  
  108.  
  109. //定义一个获取号码归属地的方法:
  110. public void getland() {
  111. result = "";
  112. SoapObject soapObject = new SoapObject(AddressnameSpace, Addressmethod);
  113. soapObject.addProperty("mobileCode", edit_param.getText().toString());
  114. soapObject.addProperty("userid", "dbdf1580476240458784992289892b87");
  115. SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
  116. envelope.bodyOut = soapObject;
  117. envelope.dotNet = true;
  118. envelope.setOutputSoapObject(soapObject);
  119. HttpTransportSE httpTransportSE = new HttpTransportSE(Addressurl);
  120. // System.out.println("号码信息设置完毕,准备开启服务");
  121. try {
  122. httpTransportSE.call(AddresssoapAction, envelope);
  123. //System.out.println("调用WebService服务成功");
  124. } catch (Exception e) {
  125. e.printStackTrace();
  126. //System.out.println("调用WebService服务失败");
  127. }
  128.  
  129. //获得服务返回的数据,并且开始解析
  130. SoapObject object = (SoapObject) envelope.bodyIn;//System.out.println("获得服务数据");
  131. result = object.getProperty(0).toString();//System.out.println("获取信息完毕,向主线程发信息");
  132. handler.sendEmptyMessage(0x001);
  133. //System.out.println("发送完毕,textview显示天气信息");
  134. }
  135.  
  136.  
  137. }

另外,别忘了导包和Internet的权限!

  1. <uses-permission android:name="android.permission.INTERNET"/>

参考代码下载:

WebServiceDemo.zip

本节小结:

好的,本节关于Android端如何去使用这个WebService就讲解到这里,下一节我们来学习一个 类似于浏览器的Android控件——WebView,敬请期待~谢谢~!

下载地址


还没有评论.