下面给书具体的实例:
mian.xml很简单就是两个编辑框:复制代码代码如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <EditText android:id="@+id/editText1" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" > <requestFocus /> </EditText> <EditText android:id="@+id/editText2" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" /> </LinearLayout> Activity:(该Activity调用了服务器端返回普通字符串的方法)复制代码代码如下:
package xidian.sl.android.webservice; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; import android.app.Activity; import android.os.Bundle; import android.widget.EditText; public class WebServiceSimpleDemo extends Activity{ final static String SERVICE_NS = "http://webService.service.sl.xidian/"; final static String SERVICE_URL = "http://192.168.1.103:8090/WebExam/services/test"; private EditText txt1; private EditText txt2; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); txt1 = (EditText) findViewById(R.id.editText1); txt2 = (EditText) findViewById(R.id.editText2); //调用的方法 String methodName = "getUser"; //创建httpTransportSE传输对象 HttpTransportSE ht = new HttpTransportSE(SERVICE_URL); ht.debug = true; //使用soap1.1协议创建Envelop对象 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); //实例化SoapObject对象 SoapObject request = new SoapObject(SERVICE_NS, methodName); /** * 设置参数,参数名不一定需要跟调用的服务器端的参数名相同,只需要对应的顺序相同即可 * */ request.addProperty("name", "1006010054"); //将SoapObject对象设置为SoapSerializationEnvelope对象的传出SOAP消息 envelope.bodyOut = request; try{ //调用webService ht.call(null, envelope); //txt1.setText("看看"+envelope.getResponse()); if(envelope.getResponse() != null){ txt2.setText("有返回"); SoapObject result = (SoapObject) envelope.bodyIn; String name = result.getProperty(0).toString(); txt1.setText("返回值 = "+name); }else{ txt2.setText("无返回"); } }catch (Exception e) { e.printStackTrace(); } } } 在AndroidManifest.xml进行Activity的注册和并添加访问网络的权限复制代码代码如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="xidian.sl.android.webservice" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".WebServiceSimpleDemo" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <!-- 声明该应用自身所拥有的权限 --> <uses-permission android:name="android.permission.INTERNET" /> </manifest> 运行后的结果如图所示: 下面我们来试着调用回传符合对象的方法: activity:复制代码代码如下:
package xidian.sl.android.webservice; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; import android.app.Activity; import android.os.Bundle; import android.widget.EditText; public class WebServiceComplexDemo extends Activity{ final static String SERVICE_NS = "http://webService.service.sl.xidian/"; final static String SERVICE_URL = "http://192.168.1.103:8090/WebExam/services/test"; private EditText txt1; private EditText txt2; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); txt1 = (EditText) findViewById(R.id.editText1); txt2 = (EditText) findViewById(R.id.editText2); //调用的方法 String methodName = "getStuList"; //创建httpTransportSE传输对象 HttpTransportSE ht = new HttpTransportSE(SERVICE_URL); ht.debug = true; //使用soap1.1协议创建Envelop对象 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); //实例化SoapObject对象 SoapObject request = new SoapObject(SERVICE_NS, methodName); /** * 设置参数,参数名不一定需要跟调用的服务器端的参数名相同,只需要对应的顺序相同即可 * */ //request.addProperty("name", "1006010054"); //将SoapObject对象设置为SoapSerializationEnvelope对象的传出SOAP消息 envelope.bodyOut = request; try{ //调用webService ht.call(null, envelope); txt2.setText("回传的值 :"+envelope.getResponse()); if(envelope.getResponse() != null){ SoapObject result = (SoapObject) envelope.bodyIn; SoapObject soapChilds = (SoapObject)result.getProperty(0); StringBuffer sb = new StringBuffer(); for(int i=0; i <soapChilds.getPropertyCount(); i++){ SoapObject soapChildsChilds = (SoapObject)soapChilds.getProperty(i); sb.append("姓名["+i+"] = "+soapChildsChilds.getProperty(0).toString()+"\n"); sb.append("学号["+i+"] = "+soapChildsChilds.getProperty(1).toString()+"\n"); sb.append("性别["+i+"] = "+soapChildsChilds.getProperty(2).toString()+"\n"+"\n"); } txt1.setText(sb.toString()); }else{ txt1.setText("无返回"); } }catch (Exception e) { e.printStackTrace(); } } } 区别就是对于返回值的处理上,使用几次getPropert()方法,这里主要看返回值的层次,看下面的结果应该就能明白了,根据括号的层次来进行确定