本人也是刚刚接触android这块的,使用ksoap,服务器是.net的写的webservice,来回搞了两天才搞好,常见的问题大家一起注意一下。
首先,关于参数这块在这个文章里面写的请清楚,什么是名字空间,方法名等等.
http://www.2cto.com/kf/201605/504915.html。按这里的参数填就不会错了。
这里面有一个问题是一直我没搞清楚的,因为我是在内网中调试的,名字空间写webservice的时候直接写成了内网的IP地址。
用get,或post都没有问题,包括我还用soapUI去测试都没有问题。
(另外说一下soapUI这是一个挺好用的工具,如果对于名字空间方法名URL里面都可以查得到。)
正确的名字空间是网址的形式:http://baidu.com/或http://www.baidu.com.
结果……你懂得,搞了一天,汗死了,一定要用网址的形式,关于名字空间的修改方法,是在写webservice服务的时候改的,问写后台的同事,让他们改吧。
如果是.net写的是在WebService.cs文件里面第一行代码。 [WebService(Namespace = "http://baidu.com/")]
如果你也跟我写得一样写成了IP地址形式的名字空间时,ksoap调用时出现的错误是:没有有效的操作参数,无法处理请求。请提供有效的 SOAP 操作。(好大的坑)
也就是说,如果这种错误是因为没有连接到web服务器或找不到web服务器上的服务,问题出在连接参数上面。soapAction这个参数千万别填错。(
)HttpTransportSE.call("http://baidu.com/方法名", envelope);
另外关于webservice的版本要注意一下:
public SoapEnvelope(int version) { this.version = version; if(version == 100) { this.xsi = "http://www.w3.org/1999/XMLSchema-instance"; this.xsd = "http://www.w3.org/1999/XMLSchema"; } else { this.xsi = "http://www.w3.org/2001/XMLSchema-instance"; this.xsd = "http://www.w3.org/2001/XMLSchema"; } if(version < 120) { this.enc = "http://schemas.xmlsoap.org/soap/encoding/"; this.env = "http://schemas.xmlsoap.org/soap/envelope/"; } else { this.enc = "http://www.w3.org/2003/05/soap-encoding"; this.env = "http://www.w3.org/2003/05/soap-envelope"; }
这是soap包里面的参数,可以看到,不同的版本,包对应的很多参数是不一样的,要注意一下。(可以都试一下,也就两个包)
如果连接正常的话,有可能还会遇到一个:
FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
这个错误因为我是做了线程,出现这个错误有两个原因,一是调用UI,子线程不能动UI你懂得,
另外其他的原因可能是结果集的序列化方式不对也会出现这个错误。一般你在出现错误的第一行后,接着往下看几行就有提式了比如:
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.ClassCastException: org.ksoap2.serialization.SoapPrimitive cannot be cast to org.ksoap2.serialization.SoapObjec:(序列化转换时出错)
at Class.NetAsyncTask.doInBackground(NetAsyncTask.java:75).
谢谢你能看到。