Android上访问Java做的WebService获取JSON数据的方法及org.xmlpull.v1.XmlPullParserException异常处理

这两天在进行一个DEMO 的编写时发现服务端的接口是基于java的WebService。之前我对于WebService没有任何接触,所以一切重头学习。

目前Android上对于Webservice的访问基本上都是通过ksoap2-android这个第三方库来实现的。但是关于这个库网上的绝大部分DEMO都是实现与.Net服务端交互,而没有提及与Java服务端的交互。本以为两者一样,但实际使用中就发现了不同,最基本的就是地址的不同.Net服务端的地址是以“.amsx”为结尾,而java服务端的地址是以“?wsdl”结尾。由于这个差异就导致了我使用DEMO中的代码访问java服务端时出现了错误。(由于刚接触WebService,这里可能会有理解错误,欢迎指正。

但后来通过百度和谷歌找了大量文章后,发现其实ksoap2-android也是支持访问java的Webservice服务端的,只需要在原有DEMO的基础做些小的修改便能够访问,获取得到JSON数据。下面废话不多说贴上代码。

 public void getGetMsg( final String id) {
     String methoName= "list";//方法名
     String url="http://localhost:8800/Demo/services/MsgService" ;//访问地址
     SoapObject soapObject= new SoapObject(null, methoName);//如果没有namespace,可以为null,有namespace可以填写,影响不大
     SoapSerializationEnvelope envelope= newSoapSerializationEnvelope(SoapEnvelope.VER10);//设置版本号
     
     soapObject.addProperty( "id",id);//传入的参数,没有参数则可忽略
     
     envelope. dotNet= false;//由于我们是要访问java端的所以这里设置为false
     envelope.setOutputSoapObject(soapObject);
     HttpTransportSE httpTranstation= new HttpTransportSE(url);
      try {
            httpTranstation.call( null, envelope);//如果没有namespace,可以为null,有namespace可以填写为namespace+methoName,两种情况亲测无差别都能正常获取数据
            Object result=envelope.getResponse();
            String str=(String) result.toString(); //获得请求的字符串
            Bundle bundle = new Bundle();
            bundle.putString( "result", str);
            Message msg = new Message();
            msg.setData(bundle);
            mHandler.sendMessage(msg);//将获取得到的JSON字符串交给handler进行进一步处理
        } catch (IOException e) {
                e.printStackTrace();                       
           } catch (XmlPullParserException e) {
                e.printStackTrace();                       
           }
    }


在运行的时候我发现了在最后处理字符串的时候一直抛出“org.xmlpull.v1.XmlPullParserException”异常,导致无法进行进一步处理。把这个异常告诉度娘,度娘会告诉你导致出现这个异常的原因有三个:

1、权限没有添加

2、代码中

SoapSerializationEnvelope envelope= newSoapSerializationEnvelope(SoapEnvelope.VER10);//设置版本号

设置的版本号大于服务端版本号,须改为小于或等于服务端的版本号

3、代码中
String url="http://localhost:8800/Demo/services/MsgService" ;//访问地址

url地址不能写IP地址,只能写域名。

以上三个地方我都修改完成后,依旧会有“org.xmlpull.v1.XmlPullParserException”异常抛出,十分郁闷。但请记住,度娘没告诉你的,谷歌娘会告诉你。通过谷歌娘我找到了导致出现这个异常的第四个原因:一般来说我们访问的webService地址会以“.wsdl”或者“?wsdl”结尾但是请注意在上面的代码中我去掉了“wsdl”

String url="http://localhost:8800/Demo/services/MsgService" ;//访问地址

原因就是我要访问的服务端是使用xfire搭建的WebService,针对xfire,我们在写地址的时候需要把结尾的“.wsdl”或者“?wsdl”去掉,才能正常访问。

参考博客:http://lianxiangbus.iteye.com/blog/1430499

你可能感兴趣的:(Android)