2013-01-15 27 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