Soap

package com.nenglong.wsclient;



import java.io.IOException;



import org.ksoap2.SoapEnvelope;

import org.ksoap2.serialization.SoapObject;

import org.ksoap2.serialization.SoapSerializationEnvelope;

import org.ksoap2.transport.HttpTransportSE;

import org.xmlpull.v1.XmlPullParserException;



import android.os.Bundle;

import android.os.Handler;

import android.os.Looper;

import android.os.Message;

import android.os.StrictMode;

import android.app.Activity;

import android.view.Menu;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;



/**

 * @author huanglong Android 平台调用WebService(手机号码归属地查询)

 */

public class MainActivity extends Activity {

    private TextView tv_result;

    private EditText et_phone;

    private Button btn_query;



    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        initView();

    }



    private void initView() {

        tv_result = (TextView) findViewById(R.id.result_text);

        et_phone = (EditText) findViewById(R.id.et);

        btn_query = (Button) findViewById(R.id.btn_query);

        btn_query.setOnClickListener(new OnClickListener() {



            @Override

            public void onClick(View v) {

                // TODO Auto-generated method stub

                String phone = et_phone.getText().toString().trim();

                if ("".equals(phone) || phone.length() < 7) {

                    et_phone.setText("您输入的手机号码有误");

                    et_phone.requestFocus();

                    tv_result.setText("");

                    return;

                }

                getRemoteInfo(phone);

            }

        });

    }



    /**

     * 查询号码段归属地的方法

     * 

     * @param phone

     *            手机号码段

     */

    public void getRemoteInfo(final String phone) {

        new Thread(new Runnable() {

            

            @Override

            public void run() {

                // TODO Auto-generated method stub

                // 命名空间

                String nameSpace = "http://WebXml.com.cn/";

                // 调用方法的名称

                String methodName = "getMobileCodeInfo";

                // EndPoint

                String endPoint = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";

                // SOAP Action

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

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

                SoapObject soapObject = new SoapObject(nameSpace, methodName);

                // 设置需要调用WebService接口的两个参数mobileCode UserId

                soapObject.addProperty("mobileCode", phone);

                soapObject.addProperty("userId", "");

                // 生成调用WebService方法调用的soap信息,并且指定Soap版本

                SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(

                        SoapEnvelope.VER10);

                envelope.bodyOut = soapObject;

                // 是否调用DotNet开发的WebService

                envelope.dotNet = true;//这里如果设置为TRUE,那么在服务器端将获取不到参数值(如:将这些数据插入到数据库中的话)

                envelope.setOutputSoapObject(soapObject);

                HttpTransportSE transport = new HttpTransportSE(endPoint);

                try {
             transport.call(soapAction, envelope); }
catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (XmlPullParserException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 获取返回的数据 SoapObject object = (SoapObject) envelope.bodyIn; // 获取返回的结果 String result = object.getProperty(0).toString(); Message message = handler.obtainMessage(); message.obj = result; handler.sendMessage(message); } }).start(); } private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { // 将WebService得到的结果返回给TextView tv_result.setText(msg.obj.toString()); }; }; }

 

webService:基于SOAP协议的远程调用标准,通过webService可以将不用的操作系统平台,不同的计算机语言,不同的技术整合到一起。

 

        调用webService需要导入jar包:ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar包,这个包在网上可以下载,至于导入的方法 ,右键项目,选择最后一项properties-->Java build path-->Libraies-->Add external Jars   选择相应的路径下的jar文件就OK了,然后记得在Order and Export 里面将选择的jar文件勾选上。

      调用webService的步骤分为7个:

1. 实例化soapObject对象,指定Soap的命名空间(从相关文档中可以查看WSDL命名空间以及调用方法)

 

[java]  view plain copy print ?
 
  1. View Code   
  2.   
  3. //命名空间  
  4.     private static final String serviceNameSpace="http://WebXml.com.cn/";  
  5.     //调用方法(获得支持的城市)  
  6.     private static final String getSupportCity="getSupportCity";  
  7.   
  8. //实例化SoapObject对象  
  9.         SoapObject request=new SoapObject(serviceNameSpace, getSupportCity);  


2.假设方法有参数的话,添加调用的方法的参数

 

request.addProperties("参数名称","参数值");

要注意的是,addProperty方法的第1个参数虽然表示调用方法的参数名,但该参数值并不一定与服务端的WebService类中的方法参数名一致,只要设置参数的顺序一致即可。

 

3.设置SOAP请求信息(参数部分为SOAP版本号,与自己要调用的SOAP版本必须一致,也就是你导入到工程中的jar相对应的版本)

 

[java]  view plain copy print ?
 
  1. //获得序列化的Envelope  
  2.         SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);  
  3.         envelope.bodyOut=request;  //确定发送对象

4.注册Enelope

 

(new  MarshalBase64()).register(envelope);

5.构建传输对象,并指定WDSL文档中的URL

 

[java]  view plain copy print ?
 
  1. //请求URL  
  2.     private static final String serviceURL="http://www.webxml.com.cn/webservices/weatherwebservice.asmx";  
  3. //Android传输对象  
  4.         AndroidHttpTransport transport=new AndroidHttpTransport(serviceURL);  
  5.         transport.debug=true;  


6.调用webService(其中参数为1:命名空间+方法名称,envelope对象);

 

 

[java]  view plain copy print ?
 
  1. transport.call(serviceNameSpace+getWeatherbyCityName, envelope);  
    //5.访问WebService,第一个参数为命名空间 + 方法名,第二个参数为Envelope对象  


7.解析返回数据:

 

 

[java]  view plain copy print ?
 
    1. View Code   
    2.   
    3. if(envelope.getResponse()!=null){  
    4.                 return parse(envelope.bodyIn.toString());  
    5.             }  
    6.   
    7. /************** 
    8.      * 解析XML 
    9.      * @param str 
    10.      * @return 
    11.      */  
    12.     private static List<String> parse(String str){  
    13.         String temp;  
    14.         List<String> list=new ArrayList<String>();  
    15.         if(str!=null && str.length()>0){  
    16.             int start=str.indexOf("string");  
    17.             int end=str.lastIndexOf(";");  
    18.             temp=str.substring(start, end-3);  
    19.             String []test=temp.split(";");  
    20.               
    21.              for(int i=0;i<test.length;i++){  
    22.                  if(i==0){  
    23.                      temp=test[i].substring(7);  
    24.                  }else{  
    25.                      temp=test[i].substring(8);  
    26.                  }  
    27.                  int index=temp.indexOf(",");  
    28.                  list.add(temp.substring(0, index));  
    29.              }  
    30.         }  
    31.         return list;  
    32.     }  

你可能感兴趣的:(SOAP)