WebService应用之客户端 Ksoap 库调用

KSOAP2 是第三方开发的专门用于在移动设备调用WebService的类库。使用 KSOAP2 调用 WebService 可分为6步来完成,其中主要使用了

SoapObject 对象来指定了要调用的方法,然后通过 HttpTransportSE 对象的call方法来调用WebService的方法,最后通过 getResponse

方法返回结果。读者可以通过本文提 供的完整示例来体会使用KSOAP2调用WebService的完整过程。在最后还介绍了如何通过异步调用

WebService 的方式来防止因服务端故障 或其他原因导致的UI组件阻塞。

使用KSOAP2调用WebService:

// 1. 指定WebService的命名空间和调用的方法名

SoapObject request = new SoapObject("http://service", "getName");

// 2. 设置调用方法的参数值

request.addProperty("param1", "value1");

request.addProperty("param2", "value2");

kSOAP 1.X/2.0可以自动把四种SOAP类型映射为Java类型

SOAP                type java type

xsd:int             java.lang.Integer

xsd:long            java.lang.Long

xsd:String          java.lang.String

xsd:boolean     java.lang.Boolean

// 3. 生成调用WebService方法的SOAP请求信息。该信息由SoapSerializationEnvelope对象描述

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

envelope.bodyOut = request;

常量SoapEnvelope.VER10:对应于SOAP 1.0规范

常量SoapEnvelope.VER11:对应于SOAP 1.1规范

常量SoapEnvelope.VER12:对应于SOAP 1.2规范

// 4. 创建HttpTransportSE对象。

HttpTransportSE ht = new HttpTransportSE("http://192.168.17.156:8080/axis2/services/SearchProductService?wsdl");

// HttpTransport 是一个强大的辅助类,来完成 Http-call transport process,它封装了网络请求的一切,你完全不用考虑序列化消息。

// 我们通过设置它的debug属性为true来打开调试信息。

// HttpTransport tx = new HttpTransport(serviceURL);

// ht.debug = true;

// 5. 使用call方法调用WebService方法,代码如下:

ht.call(null, envelope);

// 由于 HttpTransport 类实际上是调用了 HttpConnection 作网络连接,所以必须另起一个线程来专门做kSOAP工作,否则会堵塞操作。

// 6. 使用getResponse方法获得WebService方法的返回结果,代码如下:

SoapObject soapObject = (SoapObject) envelope.getResponse();

import org.ksoap2.SoapEnvelope;
    import org.ksoap2.serialization.SoapObject;
    import org.ksoap2.serialization.SoapSerializationEnvelope;
    import org.ksoap2.transport.HttpTransportSE;
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;  

    public class Main extends Activity implements OnClickListener
    {
        @Override
        public void onClick(View view)
        {
            EditText etProductName = (EditText)findViewById(R.id.etProductName);
            TextView tvResult = (TextView)findViewById(R.id.tvResult);
            // WSDL文档的URL,192.168.17.156为PC的ID地址
            String serviceUrl = "http://192.168.17.156:8080/axis2/services/SearchProductService?wsdl";
            // 定义调用的WebService方法名
            String methodName = "getProduct";
            // 第1步:创建 SoapObject 对象,并指定 WebService 的命名空间和调用的方法名
            SoapObject request = new SoapObject("http://service", methodName);
            // 第2步:设置WebService方法的参数
            request.addProperty("productName", etProductName.getText().toString());
            // 第3步:创建SoapSerializationEnvelope对象,并指定WebService的版本
            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            // 设置bodyOut属性
            envelope.bodyOut = request;
            // 第4步:创建HttpTransportSE对象,并指定WSDL文档的URL
            HttpTransportSE ht = new HttpTransportSE(serviceUrl);
            try
            {
                // 第5步:调用WebService
                ht.call(null, envelope);
                if (envelope.getResponse() != null)
                {
                    // 第6步:使用 getResponse 方法获得WebService方法的返回结果
                    SoapObject soapObject = (SoapObject) envelope.getResponse();
                    // 通过 getProperty 方法获得 Product 对象的属性值
                    String result = "产品名称:" + soapObject.getProperty("name") + "\n";
                    result += "产品数量:" + soapObject.getProperty("productNumber") + "\n";
                    result += "产品价格:" + soapObject.getProperty("price");
                    tvResult.setText(result);  

                }
                else {
                    tvResult.setText("无此产品.");
                }
            }
            catch (Exception e)
            {
            }
        }
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            Button btnSearch = (Button) findViewById(R.id.btnSearch);
            btnSearch.setOnClickListener(this);
        }
    }  

// 异步处理结果

  import org.ksoap2.SoapEnvelope;
    import org.ksoap2.serialization.SoapObject;
    import org.ksoap2.serialization.SoapSerializationEnvelope;
    import org.ksoap2.transport.HttpTransportSE;
    import android.app.Activity;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;  

    public class Main extends Activity implements OnClickListener
    {
        private EditText etProductName;
        private TextView tvResult;  

        class WSAsyncTask extends AsyncTask
        {
            String result = "";
            @Override
            protected Object doInBackground(Object... params)
            {
                try
                {
                    String serviceUrl = "http://192.168.17.156:8080/axis2/services/SearchProductService?wsdl";
                    String methodName = "getProduct";
                    SoapObject request = new SoapObject("http://service",
                            methodName);
                    request.addProperty("productName", etProductName.getText().toString());
                    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                            SoapEnvelope.VER11);
                    envelope.bodyOut = request;
                    HttpTransportSE ht = new HttpTransportSE(serviceUrl);  

                    ht.call(null, envelope);
                    if (envelope.getResponse() != null)
                    {
                        SoapObject soapObject = (SoapObject) envelope.getResponse();
                        result = "产品名称:" + soapObject.getProperty("name") + "\n";
                        result += "产品数量:" + soapObject.getProperty("productNumber")
                                + "\n";
                        result += "产品价格:" + soapObject.getProperty("price");  

                    }
                    else
                    {
                        result = "无此产品.";
                    }
                }
                catch (Exception e)
                {
                    result = "调用WebService错误.";
                }
                // 必须使用post方法更新UI组件
                tvResult.post(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        tvResult.setText(result);  

                    }
                });
                return null;
            }  

        }
        @Override
        public void onClick(View view)
    {
        // 异步执行调用WebService的任务
            new WSAsyncTask().execute();
        }
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            Button btnSearch = (Button) findViewById(R.id.btnSearch);
            btnSearch.setOnClickListener(this);
            etProductName = (EditText) findViewById(R.id.etProductName);
            tvResult = (TextView) findViewById(R.id.tvResult);  

        }
    }

时间: 2024-10-10 18:19:28

WebService应用之客户端 Ksoap 库调用的相关文章

C/C++利用gsoap库调用WebService

C/C++调用WebService需要用到soap库,一般使用的有gsoap和axis cpp两种实现,这里使用gsoap来调用.gsoap可以在 linxu.windows.mac多种平台上使用. gsoap的主页地址是http://gsoap2.sourceforge.net/ 新建一个WebService: 1 //写一个简单的方法 2 [WebMethod(Description="返回字符串")] 3 public string HelloWorld(string str)

Live555 中的客户端动态库.so的调用方式之一 程序中调用

1.  打开动态链接库:    #include <dlfcn.h>    void *dlopen(const char *filename, int flag);    该函数返回操作句柄,如:    void *pHandle = dlopen(strSoFilePath, RTLD_LAZY); 2.  取动态对象地址:    #include <dlfcn.h>    void *dlsym(void *pHandle, char *symbol);    dlsym根据

Atitit 动态调用webservice与客户端代理方式调用

方式1: 使用call.invoke  直接调用WSDL,缺点:麻烦,不推荐--特别是JAVA调用.NET的WS时,会有不少的问题需要解决. 方式2: 生成测试STUB--此种方法更快捷.如果用.NET开发WS客户端,就是用的这种方式-- 客户端调用web service方法首先要使用cxf的wsdl2java命令工具生成服务代理类,如:wsdl2java -p com.charles.client http://localhost:8080/queryUser?wsdl具体命令格式可使用wsd

Java创建WebService服务及客户端实现(转)

简介 WebService是一种服务的提供方式,通过WebService,不同应用间相互间调用变的很方便,网络上有很多常用的WebService服务,如:http://developer.51cto.com/art/200908/147125.htm,不同的语言平台对WebService都有实现,Java的WebService实现,比较流行的有Axis2.Jaxws,本文介绍的是Axis2. Axis2下载和部署 Axis2是Apache开发的一个开源项目,再次感叹Apache的伟大! 下载地址

WebService 服务端客户端 实例(一)

Delphi中WebService包含的组件解释(有7个)     (1) THTTPRIO-------:使用Http消息来调用远程使用SOAP的接口对象     (2) THTTPReqResp---:给服务器发送一个SOAP消息, THTTPReqResp在可调用接口上执行一个方法请求.       (3) TOPToSoapDomConvert ----:TOPToSoapDomConvert处理Soap方法请求的组合与分发     (4) TSoapConnection:TSoapCo

webservice简介及客户端搭建

在环境变量中,CLASSPATH添加D:\apache-cxf-2.4.2\lib 新建CXF_HOME   D:\apache-cxf-2.4.2 在PATH中添加   D:\apache-cxf-2.4.2\bin 在JAVA_HOME环境变量中添加jdk\jre路径 webservice到底是什么? webservice是一种跨编程语言和跨操作系统平台远程调用技术 所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则

[Python]webservice 学习(1) -- 简单服务和调用

由于项目中需要用到webservice来做接口,于是花点时间先做知识储备. 开始的时候觉着这个webservice就是一个http请求啊,服务端监听,客户端发送xml报文,然后解析下发送了什么内容,返回响应的数据. 这是百度百科对webservice的定义,一般使用wsdl来描述服务. 后来我的误区就是 wsdl的xml  和 用http 请求组成的xml也就是用soap来请求webservice, 这两种xml为啥不一样... 困惑: 看了些资料以后才明白,wsdl就是你发布的webservi

Java创建WebService服务及客户端实现

简介 WebService是一种服务的提供方式,通过WebService,不同应用间相互间调用变的很方便,网络上有很多常用的WebService服务,如:http://developer.51cto.com/art/200908/147125.htm,不同的语言平台对WebService都有实现,Java的WebService实现,比较流行的有Axis2.Jaxws,本文介绍的是Axis2. Axis2下载和部署 Axis2是Apache开发的一个开源项目,再次感叹Apache的伟大! 下载地址

【转载】HTTP/FTP客户端开发库:libwww、libcurl、libfetch

网页抓取和ftp访问是目前很常见的一个应用需要,无论是搜索引擎的爬虫,分析程序,资源获取程序,WebService等等都是需 要的,自己开发抓取库当然是最好了,不过开发需要时间和周期,使用现有的Open source程序是个更好的选择,一来别人已经写的很好了,就近考验,二来自己使用起来非常快速,三来自己还能够学习一下别人程序的优点.闲来无事,在网上浏览,就发现了这些好东西,特别抄来分享分享.主要就是libwww.libcurl.libfetch 这三个库,当然,还有一些其他很多更优秀库,文章后面