Android调用Tomcat+axis2发布的WebService常见问题

本文总结了Android调用Tomcat+Axis2发布的WebService时遇到的常见问题,包括使用Thread和Handler、用IP地址代替localhost、处理不同类型的返回结果等,并提供了详细的解决步骤。此外,还强调了命名空间、版本匹配、权限声明以及参数对应等关键点。
摘要由CSDN通过智能技术生成

转载请注明出自zfhsandra的博客:http://blog.csdn.net/zfhsandra/article/details/78791632

最近在学习Android,想用Android调用自己发布的Webservice,花了两天时间才调出来。我完全是一个菜鸟吧,所以碰到的问题可能和大家不一样,参考了很多网上教程,但是跟我实际存在的问题相比都不全,或者重点不一样,有些问题还是通过比较代码分析出来的,所以决定自己写一个博文总结一下,也希望能帮到和我一样的,想使用Android和WebService的新手!

先把问题列出来吧,大家可以先自查一下
1. 使用Thread和handler调用WebService
2. 用ip地址而不是localhost访问主机,ip可能变化
3. axis2发布的WebService的url后缀为“?wsdl”
4. 对应的字符串一定要准确,否则调用失败,比如namespace要注意是“http://example”还是“http://example/
5. Envelope.bodyin的返回结果可能是SoapFault也可能是SoapObject,针对两种情况处理返回结果
6. SoapEnvelop的版本和WebService要一致
7. 调用公共WebService时先确认网址有效
8. ksoap2包的版本问题
9.Manifest中使用Internet权限
10. 参数的对应问题

下面是详细讲解

1. 使用Thread和handler调用WebService

我用的sdk是25,我记得调试的时候看到过说新版的sdk不允许在主线程调用WebService,所以要引入线程,子线程又不可以修改UI,所以如果需要调用WebService并在UI中显示结果,就需要使用Thread和handler来调用。

2. 用ip地址而不是localhost访问主机

安卓机不可以识别localhost,要用ip地址来访问。模拟机的话直接能访问,真机的话还需要调一下防火墙,这里不细讲了。
另外还要注意本机ip是可能变化的,调用失败的时候可以检查一下url能不能再网页中打开,最好设置一下,使ip固定。

3. axis2发布的WebService的url后缀为“?wsdl”

我在之前完全是Java新手,WebService新手,目前还是在读学生,只有简单的C、C++、python基础,所以碰到了一些很脑残很简单的问题,求轻喷。比如说这里,在调用公共webservice的时候,很多代码里面有一句是envelop.dotNet = true,这句话是表示这个WebService是用.Net发布的,但是使用Tomcat+axis2发布的服务不用加上这句话。
而且,当服务不是dotNet发布的时候,服务的url是以?wsdl结尾的,要在EPR后面加上“?wsdl”的后缀。

4. namespace要注意是“http://example”还是“http://example/

这个也是我一开始没注意的地方,后来返回出错的时候才发现namespace多打了一个‘/’,不过在调用公共WebService(www.webxml.com.cn)的时候,他们的namespace后面都有一个‘/’,我当时调用自己服务的时候就顺手加上了,后来发现有这个‘/’调用会出错,所以需要检查一下,url、namespace、method这些东西一定要跟你的服务完全对应,不然都是调用不出来的。


以上是到调用WebService之前可能存在的问题,你可以在调用的同时打印日志,查看是否调用成功。调用成功后,结果还可能出现问题。


5. Envelope.bodyin的返回结果可能是SoapFault也可能是SoapObject,针对两种情况处理返回结果

当引用返回错误结果的时候,继续用SoapObject = envelope.bodyin程序就会报错甚至崩溃,所以先判断一下bodyin的类型,再根据类型得到返回值。

    if ( envelope.bodyIn instanceof SoapFault){
        SoapFault error = (SoapFault)envelope.bodyIn;
        result = error.toString();
    } else {
        SoapObject object = (SoapObject) envelope.bodyIn;
        // Get returned result
        result = object.getProperty(0).toString();
    }

下面是一些对我影响较小,但是其他博文中普遍提到的问题


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值