SOAP

来源:互联网 发布:优质小麦基因组数据库 编辑:程序博客网 时间:2024/05/16 15:42
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.     }  
0 0
原创粉丝点击