我对使用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的查询字符串中排除方法调用但我仍然得到相同的错误。
非常感谢任何帮助。
感谢您的时间,
贝
答案 0 :(得分:1)
尝试删除显示名称和命名空间。我知道在通过CFML公开Web服务时,这些都不是必需的。我还怀疑你有一个你没有看到的错误。请注意,在您的错误中它有:
org.xmlpull ....(位置:START_TAG &lt; html&gt; @ 2:44 in java.io.InputStreamReader@40ff5440)
那个html标签告诉我你的网络服务正在抛出错误。当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 Services的工作,所以我在这里只能提供帮助。
但是,我注意到您的WSDL将测试方法参数定义为Double。这对CF来说是正常的,因为数字类型可以包含任何类型的数字。但是,上面的示例代码显示以下内容:
inputArgs.setType(Integer.class);
尝试将其更改为Double.class(或者Java中的任何内容,以匹配参数类型。
这就是我为你所做的一切。祝你好运!
答案 1 :(得分:1)
我怀疑问题是您通过SOAP调用Web服务,但响应不是预期的格式(XML)。如果您查看来自网络服务电话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函数中指定returnType
XML,看看是否有效。您可能仍需要调整输出以获得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>