【问题标题】:kSOAP XmlPullParserExceptionkSOAP XmlPullParserException
【发布时间】:2013-01-15 10:39:39
【问题描述】:

我在尝试使用 kSOAP2 在 Android 中使用 ColdFusion SOAP 服务时遇到问题。这是我在 ColdFusion 中调用测试方法的 java 代码(它只返回一个字符串):

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 的查询字符串中排除方法调用,但我仍然得到相同的错误。

任何帮助将不胜感激。

感谢您的宝贵时间,

托尼

【问题讨论】:

    标签: java android coldfusion ksoap2


    【解决方案1】:

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

    org.xmlpull....(位置:START_TAG @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 服务。
    【解决方案2】:

    我怀疑问题是您正在通过 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>
    

    【讨论】:

    • 嗨 Miguel-F,非常感谢您的回复。不幸的是,kSOAP2 在返回 XML 时仍然抛出错误。为了避免我的项目出现延迟,我将我使用的解析引擎从 kSOAP 更改为 SAX——它可以完美地解析 XML。我将来仍然想使用 kSOAP,所以我会继续寻求解决方案 - 如果我这样做了,我会回来发布解决方案(脸上带着得意的微笑!)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多