这几天要通过webservice来获取数据,于是想找一个开源的soap解析框架,由于android移动应用的特殊性——app的安装包不能过大,所以这样的
一个框架必须是一个轻量级框架,功能与接口简单,于是在网上找到了ksoap这样一个soap协议解析框架。
Ksoap是Enhydra.org组织的一个开源作品,他是基于Enhydra.org出品的开源通用XML解析器KXML上进行开发的,2002年推出了Ksoap1.2版本,
2003年推出了Ksoap2版本,Ksoap2提供了对soap序列化更好的支持。Ksoap2是一个轻量级的J2ME平台的实现框架,提供了soap协议消息的
组装,网络post,网络return,解析等功能。
Ksoap2 api :http://ksoap2.sourceforge.net/doc/api/ Ksoap2 官方网站:http://ksoap.objectweb.org
Ksoap2 包介绍
org.ksoap2这个包含了两个基础类,主要用于定义SOAP封装相关方面的东西。如:对SOAP版本的支持,NameSpace的定义方式。
org.ksoap2.serialization 这个包主要实现了SOAP的封装以及序列化相关方面的功能,如:协议加密等。
org.ksoap2.servlet 这个包主要实现了servlet访问相关功能。
org.ksoap2.transport 这个包实现了HTTP连接相关功能,如:数据的提交与返回。
Ksoap2 主要接口介绍
SoapEnvelope
SoapObject
SoapSerializationEnvelope
HttpTransportSE
SoapEnvelope 中提供了不同SOAP版本的支持,封装了SOAP中的head,和body对象。
SoapObject 实现了KvmSerializable接口,被封装成soap 节点的消息体,或者消息体节点的子节点。取代了传统的类如果能够被当作节点类就必须实现
KvmSerializable接口这样一种情况。
SoapSerializationEnvelope 继承了SoapEnvelope类,实现了SOAP序列化功能。
HttpTransportSE 提供了访问、获取服务器SOAP数据的功能,它使用的是J2ME的连接框架来访问的。需要在子线程中进行操作,否则会引起主线程阻塞。
Ksoap2 访问webservice
public static String loginInfo(String username,String psw){
String method_name = "login";
//String soapAtion = "http://ws.picc.speedtalk.com/login";
if(username!=null && psw!=null){
SoapObject object = new SoapObject(nameSpace, method_name);
object.addProperty("id", username);
object.addProperty("pwd", psw);
//传入所支持的SOAP版本作为参数
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = object;//设置SOAP节点的消息体
envelope.dotNet = false;
envelope.implicitTypes = true;
envelope.setOutputSoapObject(object);
(new MarshalBase64()).register(envelope);
HttpTransportSE se = new HttpTransportSE(Url);
se.debug = true;//打开调试信息,这应该就是日志开关
try {
se.call(null, envelope);
if(envelope.getResponse()!=null){
SoapObject sObject = (SoapObject) envelope.bodyIn;
String isSucceed = sObject.getPropertyAsString(0).toString();
return isSucceed;
}
} catch (HttpResponseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e){
e.printStackTrace();
}
}
return null;
}
public static String nameSpace = "http://htws.picc.speedtalk.com";
public static String Url = "http://192.168.1.231:8888/piccHT/services/piccHT.piccHTHttpSoap11Endpoint/";
其中nameSpace就是webservice 中的targetNamespace,Url即是webservice的wsdl文件中的soap:address 节点。上面soapAction表示的是
为Soap规范定义了一个HTTP的新标头,这个标头可以为空。故当调用call方法时,那个soapAction可以为空。
这样就完成了传入参数 username,password给webservice,然后获取返回结果,就能够通过webservice形式来验证账号和密码的正确性。
参考:http://www.cnblogs.com/tyler2000/archive/2011/06/09/ksoap2--webservice.html