Android使用ksoap2-android调用WebService

现在的移动设备根本不可能离得开网络连接,数据的交换。最近学习的是在android端如何去调用远程WebService,都说WebService是一种基于SOAP协议的远程调用标准,对于这个协议理解不深,知道webservice可以将不同操作系统平台、不同语言、不同技术整合到一块,android SDK没有直接调用webservice的库,最常用的是借助ksoap2-android这个第三方SDK,点击打开链接,然后和其他第三方jar包一样导入android项目中即可。

1,定义webservice的NAMESPACE和URL

<string name="nameSpace">http://tempuri.org/</string>
<string name="serviceURL_203">http://public.ebanji.cn/web5/Server/iSchoolServer.asmx</string>

2,创建HttpTransportSE传输对象:HttpTransportSE ht = new HttpTransportSE(SERVICE_URL); SERVICE_URL是webservice提供服务的url

HttpTransportSE ht = new HttpTransportSE(serviceURL);
ht.debug=true;

3,实例化SoapObject对象:SoapObject soapObject = new SoapObject(SERVICE_NAMESPACE, methodName); 第一个参数表示WebService的命名空间,可以从WSDL文档中找到WebService的命名空间。第二个参数表示要调用的WebService方法名。

SoapObject request = new SoapObject(nameSpace, methodName);

4,使用SOAP1.1协议创建Envelop对象:SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 设置SOAP协议的版本号,根据服务端WebService的版本号设置。

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

5,设置调用方法的参数值,如果没有参数,可以省略:例如soapObject.addProperty("name", value);

if(param_list!=null){
    for(int i=0;i<param_list.length();i++)
    {
        request.addProperty(param_list.getJSONObject(i).getString("name"),param_list.getJSONObject(i).getString("value"));
    }
}

6,设置与.NET提供的webservice保持较好的兼容性

 envelope.dotNet=true;

7,记得设置bodyout属性 envelope.bodyOut = soapObject;

envelope.bodyOut=request;
envelope.setOutputSoapObject(request);

8,调用webservice:ht.call(SERVICE_NAMESPACE+methodName, envelope);

ht.call(nameSpace+methodName, envelope);

9,解析服务器响应的SOAP消息

SoapObject result =(SoapObject) envelope.bodyIn;
String resultStr = result.getProperty(0).toString();

附上建进整理的源代码:

/**
 * 调用服务器方法
 * @param nameSpace     要调用WebServices的命名空间
 * @param serviceURL    要调用WebServices的绝对地址
 * @param methodName    要调用WebServices哪个方法名
 * @param param_list    要输入的参数数组,没有写null
 * @return    返回服务器数据
 * @throws JSONException 参数出错
 */
private String Get_WebService_1_String(String nameSpace,String serviceURL,String methodName,JSONArray param_list) throws JSONException{
    try {
        SoapObject request = new SoapObject(nameSpace, methodName);
        if(param_list!=null){
            for(int i=0;i<param_list.length();i++)
            {
                request.addProperty(param_list.getJSONObject(i).getString("name"),param_list.getJSONObject(i).getString("value"));
            }
        }
        Log.d("Informacation", "参数正确");
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.bodyOut=request;
        envelope.dotNet=true;
        envelope.setOutputSoapObject(request);
        HttpTransportSE ht = new HttpTransportSE(serviceURL);
        ht.debug=true;
        Log.d("Informacation","网络是否开启,访问地址为:"+serviceURL);
        ht.call(nameSpace+methodName, envelope);
        SoapObject result =(SoapObject) envelope.bodyIn;
        return result.getProperty(0).toString();
    }
    catch (XmlPullParserException e) {
        // TODO 自动生成的 catch 块
        Log.d("Informacation","XmlPullParserException错误:"+e.toString());
    }catch(IOException e)
    {
        Log.d("Informacation","IO错误:"+e.toString());
    }
    catch(Exception e)
    {
        Log.d("Informacation","有可能是方法里面参数不对,或者没有这个方法,错误原因:"+e.toString());
    }
    return "";
}

上面这个便是主要实现远程调用webservice的代码,其他实现在activity中完成即可,但是这里也会涉及到一个问题,就是Android多线程问题,在调用webservice时,为了防止ANR的出现,不能在主线程中进行,需要另开子线程执行,,因为子线程涉及到UI更新,Android主线程是线程不安全的

另外开一个线程来调用webservice

/**
 * 调用的服务为WebService_1
 * @param context       要传入Activity
 * @param message       用于返回的消息
 * @param methodName    传入的方法名称
 * @param param_list    要传入方法的参数和值,如 [{‘name‘:‘方法名‘,‘value‘:‘方法值‘},{‘name‘:‘2‘,‘value‘:‘2‘}]
 */
public void Get_WebService_1_Connect(Message message,String methodName,JSONArray param_list){
    this.Target_Message=message;
    this.NameSpace=context_this.getString(R.string.nameSpace);
    this.MethodName=methodName;
    this.Param_List=param_list;
    if(!isNetworkConnected()){
        Toast.makeText(context_this,"网络没有开启,请开启网络", Toast.LENGTH_LONG).show();
        return ;
    }
    Thread thread=new Thread(runable);
    thread.start();
}

如下为匿名线程类

/**
 * 线程,把服务器返回的数据发送出去
 */
Runnable runable=new Runnable(){
    @Override
    public void run() {
        try {
            String value= Get_WebService_1_String(SoapConnect.this.NameSpace,SoapConnect.this.ServiceURL,SoapConnect.this.MethodName        ,SoapConnect.this.Param_List);
            Bundle bundle=Target_Message.getData();
            bundle.putString("Data", value);
            Target_Message.setData(bundle);
            Target_Message.sendToTarget();
        } catch (Exception e) {
            Log.d("Informacation", "线程出错");
        }
    }
};

接下来只要编写上面编写的调用webservice的方法和编写handle重写handleMessage方法可以实现调用完成后对数据的处理

编写的调用webservice的方法

/**
 * 远程调用
 *
 * @param Local_MethodName 要返回的本地方法
 * @param Remote_MethodName 要调用远程的方法
 * @param Param_List 要调用远程方法的参数
 */
private void Remote_Calls(MethodName Local_MethodName,int Remote_MethodName, JSONArray Param_List) {
    // 调用服务器方法
    SoapConnect sc = new SoapConnect(DocumentBoxCenterListActivity.this);
    myHandler handler = new myHandler();
    Message message = handler.obtainMessage();
    Bundle bundle = new Bundle();
    bundle.putString("MethodName", Local_MethodName.toString());
    message.setData(bundle);
    sc.Get_WebService_1_Connect(
            message, DocumentBoxCenterListActivity.this.getString(Remote_MethodName), Param_List);
}

编写handle重写handleMessage方法可以实现调用完成后对数据的处理

/**
 * 自定义Handler 专门对这个Activity处理服务器传送回来的数据
 */
class myHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
        Log.e("Informacation", "数据正确返回");
        if (msg.getData().get("MethodName") == MethodName.GetDocumentBoxs_Remote.toString()) {
            GetDocumentBoxs_Remote(msg.getData().getString("Data"));
        }
        super.handleMessage(msg);
    }
};

Android使用ksoap2-android调用WebService

时间: 2024-10-10 16:29:36

Android使用ksoap2-android调用WebService的相关文章

C#程序员学习Android开发系列之调用WebService

我在学习Android开发过程中遇到的第一个疑问就是Android客户端是怎么跟服务器数据库进行交互的呢?这个问题是我当初初次接触Android时所困扰我的一个很大的问题,直到几年前的一天,我突然想到WebService是否可以呢?让WebService充当服务器端的角色,完成与服务器数据库操作相关的事情,而Android客户端只要按照WebService方法参数的要求去调用就行了.在当时我对这个解决方案的实现还没模糊,我想这个问题也是初学Android的朋友肯定会想到的问题.那么现在就让我们动

Android开发系列之调用WebService

我在学习Android开发过程中遇到的第一个疑问就是Android客户端是怎么跟服务器数据库进行交互的呢?这个问题是我当初初次接触Android时所困扰我的一个很大的问题,直到几年前的一天,我突然想到WebService是否可以呢?让WebService充当服务器端的角色,完成与服务器数据库操作相关的事情,而Android客户端只要按照WebService方法参数的要求去调用就行了.在当时我对这个解决方案的实现还没模糊,我想这个问题也是初学Android的朋友肯定会想到的问题.那么现在就让我们动

Android使用ksoap2-android调用WebService学习

转自 Android使用ksoap2-android调用WebService学习 之前主要做客户端UI交互,很少处理数据和接触服务端,但现在的移动设备根本不可能离得开网络连接,数据的交换.最近学习的是在android端如何去调用远程WebService,都说WebService是一种基于SOAP协议的远程调用标准,对于这个协议理解不深,知道webservice可以将不同操作系统平台.不同语言.不同技术整合到一块,android SDK没有直接调用webservice的库,最常用的是借助ksoap

Android通过ksoap2这个框架调用webservice大讲堂

昨天有人问我Android怎么连接mysql数据库,和对数据库的操作呀,我想把,给他说说json通信,可是他并不知道怎么弄,哎算了吧,直接叫他用ksoap吧,给他说了大半天,好多零碎的知识,看来还是有必要把这些东西整合起来,一方面自己有时候也看,另一方面当然是能帮助没有做个的小伙伴,其实东西不是很多,就是讲的有点详细,不怕多,就怕不仔细, WebServices简介 Web services是一种部署在Web上的对象或者组件,能够通过Internet进行调用的应用程序.Web services

在Android中使用Android Ksoap2调用WebService

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

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

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

Android调用WebService系列之KSoap2对象解析

在在网络APP中有2个非常重要的节 客户端请求服务端接口的能力 客户端,服务端的对接 而我的Android调用WebService系列共四篇这是最后一篇,所要讲述的只仅仅是Android调用WebService这一种比较少用且不推荐用,但是在一些特定的场合下不得不用的调用方式. Android调用WebService系列之封装能力,Android调用WebService系列之请求调用是讲的请求服务端的能力主要是介绍APP如何拥有,或者说更好的更方便的拥有这种能力 而Android调用WebSer

Android调用WebService

这两天给老师做地铁app的demo,与后台的交互要用WebService,还挺麻烦的.所以想写点,希望有用. Web Services(Web服务)是一个用于支持网络间不同机器互操作的软件系统,它是一种自包含.自描述和模块化的应用程序,它可以在网络中被描述.发布和调用,可以将它看作是基于网络的.分布式的模块化组件.它建立在HTTP,SOAP,WSDL这些通信协议之上,可以轻松的跨平台. 我们用的WebService就是服务器公布的一个接口,连上之后可以交互.WSDL是一份XML文档,它描述了We

android 使用Ksoap2工具类实现WebService网络编程

1.下载Ksoap2,将jar包拷贝到libs目录下.然后右键点击拷贝进来的jar,在弹出菜单中点击Add As Library. 2.在AndroidManifest.xml中添加访问网络的权限 <uses-permission android:name="android.permission.INTERNET"/> <?xml version="1.0" encoding="utf-8"?> <manifest