上篇文章做好了准备工作,现在就实践(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文件下,在导入
记得选中(切记)
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)运行效果
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 }