上学期高医疗app,Android版的,在学校能接触到这样的项目,也许是对我一种实践的机会吧,刚开始老师让我仿照一些app设计做,我参考了一些优秀的app设计,当我把页面设计完的时候的就去调用服务端的接口,然而我在网上找了好多关于Android通过soap协议与服务端接口通信,然而好多东西都能用,走了很多弯路,今天会想起来还真是感到痛苦,当时每天都在实验室纠结这个事情,好了,废话说了,下面我就来讲解一下我是怎么成功的调用服务端接口返回数据的,
首先,我们需要在自己的项目里面导入一个包,网上下载Ksoap2开发包,有很多版本吧,随便一个就行,
下载好之后导入工程,准备工作都做完之后,我们就进入核心代码部分,这是一个带二个参数的方法,在 request.addProperty("arg0",arg0); 这行代码中,是将请求的参数传递进去,这里的第一个参数必须是arg0或arg1.。。。不能是其他的,因为在wsdl端接收的端口必须为同名的,
其次在 envelope.dotNet=false;这行代码里面如果服务器端用的是cxf发布的webservice必须为false,否则服务端接收不到参数,当时我就一直不知道这个问题,纠结了好久,后来我一行行代码的检查,才发现,可能是这个包的一个bug吧,在 if(envelope.bodyIn instanceof SoapFault){
String str = ((SoapFault) envelope.bodyIn).faultstring;
}这个判断条件中,必须的进行try——上,不然发现类型不匹配,,这些可能都是开发者遇到的问题,我把他列出来,希望小伙伴们以后遇到这种问题不要走太多的弯路
public List<String> getMessageOfPersonOfandroid(String arg0) {
final String methodName="getMessageOfPersonOfandroid";
final String soapAction=AtjApi.namespace+methodName;
request = new SoapObject(AtjApi.namespace, methodName);
request.addProperty("arg0",arg0);
Log.i("第二个方法参数", arg0);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
(new MarshalBase64()).register(envelope);
envelope.bodyOut = request;
envelope.dotNet=false;
envelope.setOutputSoapObject(request);
HttpTransportSE ht = new HttpTransportSE(AtjApi.serviceUrl);
ht.debug=true;
try {
ht.call(soapAction, envelope);
if(envelope.bodyIn instanceof SoapFault){
String str = ((SoapFault) envelope.bodyIn).faultstring;
}else {
request=(SoapObject) envelope.bodyIn;
//遍历Web Service获得的集合
//对单个的数据进行再次遍历,把它的每行数据读取出来
for (int j = 0; j < request.getPropertyCount();j++) {
childObject=(SoapObject) request.getProperty(j);
for (int i = 0; i < childObject.getPropertyCount(); i++) {
if (childObject.getProperty(i)==null) {
}
else {
list.add(childObject.getProperty(i).toString());
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}