2013-01-15 22 views
3

我很困惑,試圖在Android中使用kSOAP2來使用ColdFusion SOAP服務。這裏是我的調用測試方法我寫了一首歌的ColdFusion(只返回一個字符串)Java代碼:kSOAP XmlPullParserException

private static final String NAMESPACE = "http://www.sub.tv/MyService.cfc?WSDL"; 
private static String URL = "http://www.sub.tv/MyService.cfc"; 
private static final String METHOD_NAME = "TestMethod"; 
private static final String SOAP_ACTION = "http://www.sub.tv/MyService.cfc?method=TestMethod"; 

public void GetData() { 

    SoapPrimitive resultstring = null; 
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

    PropertyInfo inputArgs = new PropertyInfo(); 
    inputArgs.setName("ID"); 
    inputArgs.setValue(1234); 
    inputArgs.setType(Integer.class); 
    request.addProperty(inputArgs); 

    SoapSerializationEnvelope soapenvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
    soapenvelope.dotNet = false; 
    soapenvelope.setOutputSoapObject(request);  

    AndroidHttpTransport httptransport = new AndroidHttpTransport(URL); 
    //httptransport.debug = true; 

    try { 
     httptransport.call(SOAP_ACTION, soapenvelope); 
     resultstring = (SoapPrimitive) soapenvelope.getResponse(); 
    } catch (Exception e) { 
     Log.d(DEBUG, e.getMessage()); 
    } 
} 

,這裏是ColdFusion的測試方法我已經寫了只返回一個字符串:

<cfcomponent displayname="test_web_service" namespace="http://www.sub.tv"> 
      <cffunction name="TestMethod" returnType = "string" access="remote" description="Test Method"> 
        <cfargument name="ID" type="numeric"> 
        <cfreturn "hello" /> 
      </cffunction> 
    </cfcomponent> 

我得到的錯誤,當我執行上面的Java代碼如下:

org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope (position:START_TAG <html>@2:44 in [email protected]) 

我懷疑問題的原因可能是我在SOAP_ACTION規定,但URL,如F正如我所知,這是調用ColdFusion SOAP Web服務方法的正確方法。在瀏覽器中執行該URL會返回預期的結果。我試過排除在該URL的查詢字符串中的方法調用,但我仍然得到相同的錯誤。

任何幫助將不勝感激。

感謝您的時間,

託尼

回答

1

嘗試刪除顯示名稱和命名空間。我知道通過CFML公開Web服務時都不需要這些。我也懷疑你有一個你沒有看到的錯誤。需要注意的是在你的錯誤有:

org.xmlpull ....(位置:START_TAG <HTML> @ 2:44 [email protected]

該HTML標籤向我暗示你的web服務正在拋出一個錯誤。當CF做到這一點時,它輸出HTML。知道這一點,這裏有一些建議。從瀏覽器:

1)直接在瀏覽器中訪問您的服務:http://www.sub.tv/MyService.cfc。登錄CF管理員並確保您看到您的CFC文檔。

2)訪問您的WSDL:http://www.sub.tv/MyService.cfc?wsdl。你應該看到你的各種功能暴露。

3)訪問您的測試功能:http://www.sub.tv/MyService.cfc?method=TestMethod&id=123

實際上,由於www.sub.tv是公衆和MyService.cfc可我測試了所有以上的爲你和它看起來像你的CFC是好事,而不是拋出錯誤。

我做你的CFC的快速測試:

<cfset test = CreateObject("WebService", "http://www.sub.tv/MyService.cfc?WSDL") /> 

<cfdump var="#test.TestMethod(123)#" /> 

這個輸出「你好」,這是如果你的Web服務是否正常運行你所期望。這表明在你如何從Android調用它時存在一個問題。我沒有在Java中使用Web服務做過很多工作,所以我只能在這裏很有幫助。

但是,我注意到您的WSDL將測試方法參數定義爲Double。這對於CF來說是正常的,因爲數字類型可以保存任何類型的數字。然而,你上面的例子代碼顯示如下:

inputArgs.setType(Integer.class); 

嘗試改變,要Double.class(或任何這應該是Java的匹配參數類型

這是對所有我已經得到了你好,祝你好運!

+0

喜道格,你的幫助非常非常感謝。我確實嘗試將類型更改爲Double.class,但不幸的是沒有工作 - 我仍然收到相同的錯誤。正如Miguel-F提到的,我已經將我的解析引擎更改爲SAX,以便使用來自ColdFusion的XML響應,但將繼續尋求解決方案以使kSOAP正常工作。我將嘗試接下來使用kSOAP來使用WCF服務。 – tony

1

我懷疑問題在於你正在通過SOAP調用一個Web服務,但是響應並不是預期的格式(XML),如果你看看你的web服務調用http://www.sub.tv/MyService.cfc?method=TestMethod&id=123生成的輸出,看到這個:

<wddxPacket version='1.0'> 
    <header/> 
    <data> 
     <string>hello</string> 
    </data> 
</wddxPacket> 

這是因爲默認情況下,ColdFusion的串行化所有返回類型(包括簡單的返回類型),除了XML,爲WDDX格式...from the CFFunction documentation here

嘗試在你的ColdFusion函數指定XML的returnType看看如果有效的話。您可能仍然需要調整輸出以獲得kSOAP預期的結果。我不知道它想要的XML格式,但這應該讓你開始。

更改CFFunction到這樣的事情:

<cffunction name="TestMethod" returnType="xml" access="remote" description="Test Method"> 
    <cfargument name="ID" type="numeric"> 
    <cfset var xml = ""> 
    <cfxml variable="xml"> 
     <test>hello</test> 
    </cfxml> 
    <cfreturn xml> 
</cffunction> 
+0

嗨米格爾-F,很多謝謝你的迴應。不幸的是,kSOAP2在返回XML時仍然出現錯誤。爲了避免在我的項目中出現延遲,我將從kSOAP到SAX的解析引擎更改爲完美解析XML。我仍然想在未來使用kSOAP,所以我會繼續爲它尋求解決方案 - 如果我這樣做,我會回來發佈解決方案(我的臉上帶着一絲笑容)! – tony