本人也是剛剛接觸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).
謝謝你能看到。