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命名空间以及调用方法)

 

  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相对应的版本)

 

  1. //获得序列化的Envelope  
  2.         SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);  
  3.         envelope.bodyOut=request;  //确定发送对象

4.注册Enelope

 

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

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

 

  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对象);

 

 

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


7.解析返回数据:

 

 

    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.     }  
posted @ 2015-03-25 00:05  Pepper.B  阅读(266)  评论(0编辑  收藏  举报