这两天在进行一个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();
}
}
1、<uses-permission android:name="android.permission.INTERNET" />权限没有添加
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