kSOAP XmlPullParserException

3

我在尝试使用kSOAP2在Android中调用ColdFusion SOAP服务时遇到了问题。以下是我编写的Java代码,用于调用我在ColdFusion中编写的测试方法(该方法仅返回一个字符串):

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 java.io.InputStreamReader@40ff5440)  

我怀疑问题的原因可能是我在SOAP_ACTION中指定的URL,但据我所知,这是调用ColdFusion SOAP Web服务方法的正确方式。在浏览器中执行该URL会返回预期的结果。我已尝试在该URL的查询字符串中排除方法调用,但仍然遇到相同的错误。
如有帮助将不胜感激。
谢谢您的时间,
Tony
2个回答

1

尝试删除显示名称和命名空间。我知道在通过CFML公开Web服务时都不需要这些内容。我还怀疑你可能有一个错误,但你没有看到。请注意,在你的错误消息中有:

org.xmlpull.... (position:START_TAG <html>@2:44 in java.io.InputStreamReader@40ff5440)

这个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)#" />

这将输出“hello”,如果您的 Web 服务正常运行,这就是您所期望的。这表明您从 Android 调用它时存在问题。我在 Java 中没有做过太多有关 Web 服务的工作,因此在此只能提供有限的帮助。

但是,我注意到您的 WSDL 将测试方法参数定义为 Double。这对于 CF 来说很正常,因为数字类型可以容纳任何类型的数字。但是,您上面的示例代码显示如下:

inputArgs.setType(Integer.class);  

尝试将其更改为Double.class(或在Java中应该匹配参数类型的任何内容)。

这就是我能为您提供的全部信息。祝你好运!


嗨,Doug,非常感谢你的帮助。我确实尝试将类型更改为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将所有返回类型(包括简单的返回类型)序列化为WDDX格式,除了XML...

从CFFunction文档中查看

尝试在你的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>

嗨Miguel-F,非常感谢您的回复。不幸的是,kSOAP2在返回XML时仍然会抛出错误。为了避免项目延迟,我已经将使用的解析引擎从kSOAP更改为SAX-它可以完美地解析XML。我仍然想在将来使用kSOAP,所以我将继续寻找解决方案-如果我找到了,我会回来发布解决方案(并带着得意的微笑!) - tony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接