關於 ksoap2呼叫 webservice 遇到的一些問題
拿到了 webservice 介面呼叫 不算完整的文件
- 當用 ksoap2 寫好程式碼 ,去呼叫 webservice 遇到
伺服器返回 500 的錯誤碼
解決方案: 可能是 ksoap2的 jar包有問題, 換一個試試(雖然原來用的這個jar是好著的,但是這次做的時候 怎麼都是500.網上細細查詢後,才說換個 jar包試試,換了後確實好了,可能也跟webservice伺服器有關係吧,畢竟第三方)
需要傳遞的引數中有帶 “&” 符號
比如: name,pwd 2個引數。 但是傳入的值中有 “&”解決方案: 剛開始看到 在webservice頁面填是沒有問題的。
但是如果要訪問傳參的話 會需要轉義就比如xml中
“<” “>” “&” 都是需要轉義的。
最後試了其實是不用轉義的,轉義反到會出錯
3 遇到這樣的錯誤: java.lang.ClassCastException: org.ksoap2.serialization.SoapPrimitive cannot be cast to org.ksoap2.serialization.SoapObject
解決方案: 其實是在訪問的程式碼中,接收結果的時候一般都是這麼寫的
//這個來接受返回來的值,但這種方法往往會產生
SoapObject soapObject = (SoapObject)envelope.getResponse();
原因就是,在伺服器端返回值是String型別的數值的時候
這兩種方法來接受值都會報出錯
SoapObject result = (SoapObject) envelope.getResponse();
SoapObject result = (SoapObject)envelope.bodyIn;
所以接收結果程式碼要改成:
Object result = (Object) envelope.getResponse();
4 . 遇到錯誤
org.xmlpull.v1.XmlPullParserException: expected: START_TAG(http://www.w3.org/2001/12/soap-envelop)
解決方案: 這個就在ksoap2 中也是訪問程式碼的部分,一般是會這麼寫的。
所以這個設定寫不對的話會遇到這個錯誤
SoapSerializationEnvelope envelope =
new SoapSerializationEnvelope(SoapEnvelope.VER11);
SoapEnvelope.VER10: 對應的是 SOAP1.0規範
SoapEnvelope.VER11: 對應的是 SOAP1.1規範
SoapEnvelope.VER12: 對應的是 SOAP1.2規範
5 . ksoap2呼叫webservice 成功, 但是返回結果不對。
解決方案:
這個就需要仔細核實 自己的傳參問題了。 當然感覺傳參一般不會又太大問題。
再就是其他的設定的問題了比如: 名稱空間了。
namespace soapAction 這個2個一定要區分開。
(1)原來我上個公司的webserivice專案裡面的
namespace(名稱空間) = http://tempuri.org/
soapAction = namespace + methodName(方法名)
(2) 但是這個webservice裡面的
namespace(名稱空間) = http://www.tempuri.org
這就必須在中間加點東西了
soapAction = namespace +”/”+ methodName(方法名)
這個還是要看清楚的咯
下面貼上上工具類的方法
public static Object GetWebServiceData(String nameSpace, String doMethod, String wsurl, List<WebParam> List){
Object result = null;
String soapAction = nameSpace + "/"+ doMethod;
//String soapAction = nameSpace + doMethod;
String wsurl1 = wsurl + "?wsdl";
// 2得到KSOAP2的核心物件,並將引數傳遞給SoapObject
SoapObject request = new SoapObject(nameSpace, doMethod);
if (List != null){
for (WebParam mWebParam : List){
request.addProperty(mWebParam.key, mWebParam.value);
}
}
//型別要注意
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = request;
System.out.println("=envelope.bodyOut=="+ envelope.bodyOut);
//伺服器是.net做的
envelope.dotNet = true;
HttpTransportSE se = new HttpTransportSE(wsurl1);
se.debug = true;
try{
se.call(soapAction, envelope);
if (envelope.getResponse() != null){
result = (Object) envelope.getResponse();
}
} catch (Exception e){
System.out.println("==WebServiceUtil=="+ e.toString());
e.printStackTrace();
}
return result;
}