加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

WebService应用之客户端 Ksoap 库调用

发布时间:2020-12-16 22:14:07 所属栏目:安全 来源:网络整理
导读:KSOAP2 是第三方开发的专门用于在移动设备调用WebService的类库。使用 KSOAP2 调用 WebService 可分为6步来完成,其中主要使用了 SoapObject 对象来指定了要调用的方法,然后通过 HttpTransportSE 对象的call方法来调用WebService的方法,最后通过 getRespon
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);  
       
        }  
    }  

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读