android通过ksoap协议与服务器发布的webservice通信

时间:2022-04-20 17:58:41

上学期高医疗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;
    }