在Android中使用Android Ksoap2调用WebService

一、WebService介绍

  WebService是基于SOAP协议可实现web服务器与web服务器之间的通信,因采用SOAP协议传送XML数据具有平台无关性,也是成为解决异构平台之间通信的重要解决方案,比如Java平台与.net平台之间。因此在web应用中有着举足轻重的作用,很多机构、组织都在各自平台上对外发布了WebService(例如:天气预报、航班信息、股市行情等等),这样任何平台和客户都可以享受到这些服务,当然有些是要付费的。

二、Android ksoap2组件

  对于Android端调用WebService,有两种方式,一种自己编写代码主要通过URL获得 HttpUrlConnection的方式建立与webservice的连接,然后进行I/O读写传送和获得数据,并对获得数据进行XML解析,比较麻烦。另一种就是使用第三方组件,比较常用的就是ksoap2-android。

  ksoap2-android这个开源组件针对Android平台提供了一个轻量级和高效的SOAP类库,可方便实现Android端与WebService之间的通信

1、环境搭建

  ksoap2-android项目的地址:http://code.google.com/p/ksoap2-android/ 大家可以下载最新版本jar,然后将jar加入到项目中即可。

  我这里使用是ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar

2、Ksoap2 使用的主要步骤

  1)web服务参数准备

// webservice服务地址

String url= “http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx”;

//web服务的命名空间

String namespace=” http://WebXml.com.cn/”;

//请求服务的方法名称

String methodName=”getMobileCodeInfo”;

//soap请求地址

String soapActionAddress = "http://WebXml.com.cn/getMobileCodeInfo";

  2)创建HttpTransportSE,该组件可发送请求

HttpTransportSE transport = new HttpTransportSE(url);

  3)创建SoapObject,添加要传送的数据(信息载体)

SoapObject soapObject = new SoapObject(namespace,methodName);

soapObject.addProperty(name,value);//添加数据

…

4)创建SoapSerializationEnvelope对象,指定xml版本,以及request中body

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

envelope.bodyOut = soapObject;

envelope.setOutputSoapObject(soapObject);

5)发送请求,调用webserivce中的方法

httpTransportSE.call(soapActionAddress, envelope);//服务传回的信息,会放在envelope的bodyIn属性中

6) 获取服务传回的数据

SoapObject object = (SoapObject) envelope.bodyIn;
三、实现案例——通过调用webservice查询手机号码的归属地

 执行效果如下:

完整代码实现:

public class MainActivity extends Activity {
    ///手机归属地Webservice的参数信息
    private static final String nameSpaceAddress = "http://WebXml.com.cn/";
private static final String urlAddress
 = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";
    private static final String methodNameAddress = "getMobileCodeInfo";
    private static final String soapActionAddress = "http://WebXml.com.cn/getMobileCodeInfo";
    private TextView telAddress = null;
    private EditText tel = null;
    private Button btnAddress = null;
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnAddress = (Button) this.findViewById(R.id.btnSearchAddress);
        telAddress = (TextView) this.findViewById(R.id.telAddress);
        tel = (EditText) this.findViewById(R.id.telNo);
        btnAddress.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    public void run() {
                        getTelAddress();
                    }
                }).start();

            }
        });
/**
* 请求WebService并获得返回的手机号码归属地信息
*/
public void getTelAddress() {
        SoapObject soapObject = new
SoapObject(nameSpaceAddress, methodNameAddress);//创建SOAP对象
        //设置属性,这些属性值通过SOAP协议传送给服务器
        soapObject.addProperty("mobileCode", tel.getText().toString());//要查询的电话号码
        soapObject.addProperty("userId", "");
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
        envelope.bodyOut = soapObject;
        envelope.dotNet = true;
        envelope.setOutputSoapObject(soapObject);
        HttpTransportSE httpTransportSE = new HttpTransportSE(urlAddress);
        try {
            //调用服务
            httpTransportSE.call(soapActionAddress, envelope);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //获取服务传回的数据,手机归属地信息
        SoapObject object = (SoapObject) envelope.bodyIn;
        txtAddress = object.getProperty(0).toString();
        //向主线程发送消息成功,getTelAddress函数执行完毕
        handlerAddress.sendEmptyMessage(0);

    }
    Handler handlerAddress = new Handler() {
        public void handleMessage(Message msg) {
            telAddress.setText(txtAddress);
            Toast.makeText(MainActivity.this,
"获取号码归属地成功"+txtAddress, Toast.LENGTH_LONG).show();
        }
    };
}
四、附:常见的WebService服务URL

手机归属地服务

http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx

天气预报Web服务,数据来源于中国气象局

http://www.webxml.com.cn/WebServices/WeatherWebService.asmx

IP地址来:

http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx

中文 <-> 英文双向翻译 WEB 服务:

http://www.webxml.com.cn/WebServices/TranslatorWebService.asmx

火车时刻表

http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx

航班查询服务

http://webservice.webxml.com.cn/webservices/DomesticAirline.asmx

中国股票行情数据 WEB 服务

http://www.webxml.com.cn/WebServices/ChinaStockWebService.asmx

中国电视节目预告

http://www.webxml.com.cn/webservices/ChinaTVprogramWebService.asmx

时间: 2024-12-06 02:28:19

在Android中使用Android Ksoap2调用WebService的相关文章

Android使用KSOAP2调用WebService及正确导入jar包的问题(转)

Android使用KSOAP2调用WebService及正确导入jar包的问题(转)     错误信息 最近在学Android使用KSOAP2调用现有的Webservice的方法,期间在网上找了很多代码,但是每次在Android模拟器中运行的时候程序都会崩溃,搞得自己都快崩溃了.... 查看了一下LogCat中的错误报告,发现是因为java.lang.NoClassDefFoundError导致程序崩溃的: view plainprint? ERROR/AndroidRuntime(600): 

关于 ksoap2调用 webservice 遇到的一些问题

拿到了 webservice 接口调用 不算完整的文档 当用 ksoap2 写好代码 ,去调用 webservice 遇到 服务器返回 500 的错误码 解决方案: 可能是 ksoap2的 jar包有问题, 换一个试试(虽然原来用的这个jar是好着的,但是这次做的时候 怎么都是500.网上细细查询后,才说换个 jar包试试,换了后确实好了,可能也跟webservice服务器有关系吧,毕竟第三方) 需要传递的参数中有带 "&" 符号 比如: name,pwd 2个参数. 但是传入

Android中Dialog对话框的调用及监听

Android中经常会需要在Android界面上弹出一些对话框提示用户,比如App的退出的时候都会有各种框来挽留你的心,支付宝的时候输入密码的密码框,非常常见及其实用的功能,类似于JS中的alter,C#中C/S中常用MessgeBox,总而言之就是一个功能弹,弹,弹,本文就简单的叙述一下Dialog的各种弹框使用及监听,顺便写了一个简单的自定义弹框,接下来请看正文: 一般对话框 先看下整个App页面: 看下一般对话框的结果: 具体代码的实现,其中定义了两个按钮,一个是确定(PositiveBu

Xamarin.Android中使用android:onClick=&quot;xxx&quot;属性

在原生Android开发中,为一个View增加点击事件,有三种方式: 1.使用匿名对象 ((ImageButton) findViewById(R.id.music_cover)) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); 我们知道,View.OnClickListener是一个接口,接口是不能直接实例化的,因此上述是使用匿名对象的原理来实现的: 2

FineReport中以jws方式调用WebService数据源方案

在使用WebService作为项目的数据源时,希望报表中也是直接调用这个WebService数据源,而不是定义数据连接调用对应的数据库表,这样要怎么实现呢? 在程序中访问WebService应用服务,将WebService返回的数据转为程序数据集,然后在设计器中调用. 以axis1.4上的WebService为例,介绍其取数方式以及将数据转换为WebService的程序数据集的过程. WebService应用服务 如在Tomcat下的Axis工程中以jwa方式发布了一个WebService应用服

[转]Android中的android:layout_width和android:width

android:width 其实是定义控件上面的文本(TextView) 的宽度,当然这个宽度也是和 android:layout_width 配合起来作用的,如果 android:layout_width="fill_parent" 的话,那么设置 android:width 是没有意义的 android:layout_width 其实是可以实现 android:width 的效果的,我觉得这应该是为什么在 android 实例中看不到有人用 android:width 的原因吧.

Android中的跨进程调用技术AIDL

什么是AIDL Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信. 为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现. 与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口. Android的四大组件中的三个(Activity.Broadcast

android下身份验证方式调用webservice

在企业开发领域,webservice还是经常被用到的服务体系,因为他对安全事务支持都比较好. 有时候,我们就需要在android下调用后端的webservice服务,因为在内部网络环境下,所有需要basic身份验证. 一般情况下,我们会用soap包来访问,但是soap包虽然封装的比较好,但是一旦出错很难找到原因.下面我们介绍一种简单的方式,通过http client post来访问webservice; 首先,我们把soap请求拼装成xml字符串,如下: String soapRequestDa

Android中Webview使用javascript调用事先定义好的Java函数

1. 首先定义好一个类,专们用于给javascript调用 public class JavaScriptInterface { // share your news public void share(String newsImageUrl, String newsTitle, String newsUrl) { Intent intent = new Intent(ActivityHomeRang.this, ActivityShare.class); Bundle news = new B