Android Web Service学习总结(二)

  上篇文章做好了准备工作,现在就实践(android平台调用web service实现号码归属地查询)

1.    Ksoap2-android简介

在Android平台调用web service需要依赖于第三方类库ksoap2,它是一个SOAP Web service客户端开发包,主要用于资源受限制的Java环境如Applets或J2ME应用程序(CLDC/ CDC/MIDP)。在Android平台中我们并不会直接使用ksoap2,而是使用ksoap2 android。KSoap2 Android 是Android平台上一个高效、轻量级的SOAP开发包,等同于Android平台上的KSoap2的移植版本。

2.    Ksoap2-android jar包下载

http://code.google.com/p/ksoap2-android/

3.    调用过程实例

1)新建工程,导入之前下载好的第三方类库

  推荐先将该类库复制到工程目录下libs文件下,在导入

  Android Web Service学习总结(二)

  记得选中(切记)

  Android Web Service学习总结(二)

2)在.java文件中编辑

  第一步:实例化SoapObject对象,指定webService的命名空间以及调用方法名称(就是在上一篇文章中准备工作中得到的)  

1 //WSDL文档中的命名空间和方法
2 private static final String targetNameSpace = "http://WebXml.com.cn/";
3 private static final String function = "getMobileCodeInfo";
4 SoapObject soapObject = new SoapObject(targetNameSpace, function);

 

  第二步:设置调用方法的参数值,如果没有参数,可以省略

   1 soapObject.addProperty("mobileCode", QueryNumber); 2 soapObject.addProperty("userID", null); 

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

  第三步:设置SOAP请求信息(参数部分为SOAP协议版本号,与你要调用的webService中版本号一致):该信息由SoapSerializationEnvelope对象描述 

1 SoapSerializationEnvelope envelop = new SoapSerializationEnvelope(SoapEnvelope.VER11);        
2 envelop.dotNet = true;
3 envelop.setOutputSoapObject(soapObject);//或者envelop.bodyOut = soapObject;

  注意:不要忘了设置SOAPSoapSerializationEnvelope类的bodyOut属性,该属性的值就是在第一步创建的SoapObject对象。

  第四步:创建HttpTransportsSE对象。通过HttpTransportsSE类的构造方法可以指定WebService的WSDL文档的URL:

HttpTransportSE httpSE = new HttpTransportSE(WSDL);

  第五步:使用call方法调用WebService方法(其中参数为1:命名空间+方法名称,2:Envelope对象): 

1 httpSE.call(targetNameSpace+function, envelop);

  第六步:使用getResponse方法获得WebService方法的返回结果

SoapObject resultObj = (SoapObject) envelop.bodyIn;

  第七步:解析返回数据

String result = resultObj.toString();

  注意:切记在AndroidManifest.xml加入网络访问权限: 

<uses-permission android:name="android.permission.INTERNET" />   

3)运行效果

  Android Web Service学习总结(二)

4)以下是完整代码:

 1 package com.example.webservice;
 2 
 3 import java.io.IOException;
 4 
 5 import org.apache.http.HttpServerConnection;
 6 import org.ksoap2.SoapEnvelope;
 7 import org.ksoap2.serialization.SoapObject;
 8 import org.ksoap2.serialization.SoapSerializationEnvelope;
 9 import org.ksoap2.transport.HttpTransportSE;
10 import org.xmlpull.v1.XmlPullParserException;
11 
12 import android.app.Activity;
13 import android.os.AsyncTask;
14 import android.os.Bundle;
15 import android.view.View;
16 import android.widget.EditText;
17 import android.widget.TextView;
18 
19 public class MainActivity extends Activity {
20     
21     private EditText edit_poneNumber;
22     private TextView text_result;
23     private String QueryNumber;
24     
25     //WSDL文档中的命名空间和方法
26     private static final String targetNameSpace = "http://WebXml.com.cn/";
27     private static final String function = "getMobileCodeInfo";
28     private static final String WSDL = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl";
29     
30 
31     @Override
32     protected void onCreate(Bundle savedInstanceState) {
33         super.onCreate(savedInstanceState);
34         setContentView(R.layout.activity_main);
35         
36         edit_poneNumber = (EditText)findViewById(R.id.edit_phone_sec);
37         text_result = (TextView)findViewById(R.id.result_text);
38     }
39     public void onQuety(View v)
40     {
41         QueryNumber = edit_poneNumber.getText().toString();
42         if("".equals(QueryNumber.trim()) || QueryNumber.length() < 7)
43         {
44             edit_poneNumber.setError("输入有误");
45             edit_poneNumber.requestFocus();
46             text_result.setText("");
47             return;
48         }
49         // 查询手机号码(段)信息
50         new getRemoteInfoTask().execute();
51     }
52     /**
53      * 手机号段归属地查询
54      * 
55      * @param phoneSec 手机号段
56      */
57     
58     public class getRemoteInfoTask extends AsyncTask<Void, Void , String>
59     {
60         @Override
61         protected String doInBackground(Void... arg0) {
62             // TODO 自动生成的方法存根
63             return getRemoteInfo(QueryNumber);
64         }
65         
66         @Override
67         protected void onPostExecute(String result)
68         {
69             text_result.setText(result);
70             super.onPostExecute(result);
71         }
72         
73     }
74     public String getRemoteInfo(String phoneSec) 
75     {
76         String result = null;
77         SoapObject soapObject = new SoapObject(targetNameSpace, function);
78         soapObject.addProperty("mobileCode", QueryNumber);
79         soapObject.addProperty("userID", null);
80         SoapSerializationEnvelope envelop = new SoapSerializationEnvelope(SoapEnvelope.VER11);        
81         envelop.dotNet = true;
82         envelop.setOutputSoapObject(soapObject);//或者envelop.bodyOut = soapObject;
83         HttpTransportSE httpSE = new HttpTransportSE(WSDL);
84         try {
85             httpSE.call(targetNameSpace+function, envelop);
86             SoapObject resultObj = (SoapObject) envelop.bodyIn;
87             result = resultObj.toString();
88         } catch (IOException e) {
89             // TODO 自动生成的 catch 块
90             e.printStackTrace();
91         } catch (XmlPullParserException e) {
92             // TODO 自动生成的 catch 块
93             e.printStackTrace();
94         }
95         return result;
96     }
97 }

  Android Web Service学习总结(一)

Android Web Service学习总结(二),布布扣,bubuko.com

Android Web Service学习总结(二)

上一篇:Android 调用webService(.net平台)


下一篇:【JavaScript】关于Hybrid App技术解决方案的选择