1. 程式人生 > >關於 ksoap2呼叫 webservice 遇到的一些問題

關於 ksoap2呼叫 webservice 遇到的一些問題

拿到了 webservice 介面呼叫 不算完整的文件

  1. 當用 ksoap2 寫好程式碼 ,去呼叫 webservice 遇到
    伺服器返回 500 的錯誤碼

解決方案可能是 ksoap2的 jar包有問題, 換一個試試(雖然原來用的這個jar是好著的,但是這次做的時候 怎麼都是500.網上細細查詢後,才說換個 jar包試試,換了後確實好了,可能也跟webservice伺服器有關係吧,畢竟第三方)

  1. 需要傳遞的引數中有帶 “&” 符號
    比如: 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;
    }