写点什么

Android 调用 WebService

作者:向阳逐梦
  • 2023-04-23
    四川
  • 本文字数:3756 字

    阅读完需:约 12 分钟

Android调用WebService

Android 调用 WebService,其实这有点类似于一些给我们提供原始数据 API 服务的数据平台,比如聚合数据!而 WebService 则用到了 XML 和 SOAP,通过 HTTP 协议即可完成与远程机器的交互!

1.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.获取相关的一些参数

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

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


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

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

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


以及返回后的 XML 数据

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


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

6.调用 WebService 的代码示例

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

运行效果图

实现代码

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"/>
复制代码


发布于: 刚刚阅读数: 4
用户头像

向阳逐梦

关注

人生享受编程,编程造就人生! 2022-06-01 加入

某公司芯片测试工程师,嵌入式开发工程师,InfoQ签约作者,阿里云星级博主,华为云·云享专家。座右铭:向着太阳,追逐梦想!

评论

发布
暂无评论
Android调用WebService_HTTP_向阳逐梦_InfoQ写作社区