1.首先要先下载好soap的java包(ksoap2-android-assembly-3.0.0-jar-with-dependencies.jar),并导入到工程里面。
2.新建一个调用web Service服务的通用类如下:
public class WebService {
private String NameSpace;//指定webService的命名空间(从相关WSDL文档中可以查看命名空间)
private String URL;//所调用服务的url
private String method;//所调用服务接口的方法
private String action; //所调用服务拦截接口方法的action Map<String,String>dataMap;//接收接口方法所需的参数
public WebService(String url,String handleAction,String method,String NameSpace){
this.URL=url;
this.method = method;
this.NameSpace=NameSpace;
this.action = handleAction+method;
}
public void setDataMap(Map<String, String> dataMap) {
this.dataMap = dataMap;
}
public SoapObject LoadResult() throws SoapFault {//实例化SoapObject 对象 SoapObject soapObject = new SoapObject(NameSpace, method);
for(String key: dataMap.keySet()) { soapObject.addProperty(key,dataMap.get(key));//设置方法参数,key的值一定要和所要求参数的名字相同,否则会出错 }
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); // 版本设置
envelope.bodyOut = soapObject;
envelope.dotNet = true;
envelope.setOutputSoapObject(soapObject);
HttpTransportSE trans = new HttpTransportSE(URL);
trans.debug = true; // 使用调试功能
try {
trans.call(action, envelope);//调用WebService
} catch (IOException e) {
System.out.println("IOException");
e.printStackTrace();
} catch (XmlPullParserException e) {
System.out.println("XmlPullParserException");
e.printStackTrace();
}
SoapObject result = (SoapObject) envelope.bodyIn;
return result;//返回SoapObject数据对象
}
}
3.调用WebService类并解析SoapObject对象返回的数据
WebService service = new WebService(Service.URL,Service.ACTION, "GetMyCourseDetail"); service.setDataMap(studentData); SoapObject soapObject = null; try { soapObject = service.LoadResult(); } catch (SoapFault e) { e.printStackTrace(); } SoapObject courseResult = (SoapObject) soapObject.getProperty(0); //要根据实际情况来解析返回结果,此处主要针对形如anyType{ArrayOfstring=anyType{string=**;string=**;...}; //ArrayOfstring=anyType{string=**;string=**;...};...},此处先是去掉外层的anyType{} for (int i = 0; i < courseResult.getPropertyCount(); i++) { SoapObject eachResult = (SoapObject) courseResult .getProperty(i);//此处主要去除第二层的anyType{} Course course = new Course(); if ("anyType{}".equals(eachResult.getProperty(3).toString())) { course.setHtml("无");//如果返回的string里面有anyType{}(即为空)可根据本人来设定内容 } else { course.setHtml(eachResult.getProperty(3).toString());//此处主要在android环境里解析时去除html标记(使用Html.fromHtml(string))
} course.setNumber("课程编号:" + eachResult.getProperty(0).toString()); course.setName("课程名称:" + eachResult.getProperty(1).toString()); course.setTeacher("任课老师:" + eachResult.getProperty(2).toString()); courseList.add(course); } 4.如果是在android里调用Web Service,必须异步调用,否则会出现Caused by: android.os.NetworkOnMainThreadException的异常。所以可以写一个类来实现线程异步加载,该类要继承AsyncTask<String, String, String>,并重写doInBackground(String... params)和onPostExecute(String s)方法。