所以我对SOAP很新,我正在尝试连接到国家气象服务的SOAP服务,以便将预测数据提取到我的网页上。以下是此过程的简短代码:
<cfinvoke
webservice="http://graphical.weather.gov/xml/SOAP_server/ndfdXMLserver.php?wsdl"
method="NDFDgen"
returnvariable="aTemp">
<cfinvokeargument name="latitude" value="37.94"></cfinvokeargument>
<cfinvokeargument name="longitude" value="-75.47"></cfinvokeargument>
<cfinvokeargument name="product" value='"glance"'></cfinvokeargument>
<cfinvokeargument name="startTime" value="2014-05-02T12:00"></cfinvokeargument>
<cfinvokeargument name="endTime" value="2014-05-05T12:00"></cfinvokeargument>
<cfinvokeargument name="Unit" value='"e"'></cfinvokeargument>
<cfinvokeargument name="weatherParameters" value="maxt = TRUE"></cfinvokeargument>
</cfinvoke>
问题是,当我尝试运行我的网页时,我收到以下错误:
Web service operation NDFDgen with parameters {Unit={"e"},startTime={2014-05-02T12:00},endTime={2014-05-05T12:00},product={"glance"},longitude={-75.47},weatherParameters={maxt = TRUE},latitude={37.94}} cannot be found.
我有点困惑,因为NDFDgen操作确实存在于我正在检索的WSDL文件中,并且我已经解决了NDFDgen操作所需的所有参数。
链接到我尝试使用的WSDL文件: http://graphical.weather.gov/xml/SOAP_server/ndfdXMLserver.php?wsdl
使用必需参数链接到功能页面: http://graphical.weather.gov/xml/#use_it
有人能看到我的代码有什么问题吗?这可能与我的论点有关,我正在传递给SOAP?我甚至尝试遵循Stack Overflow问题(Consuming ColdFusion webservice - Web service operation with parameters {} cannot be found)的建议并添加了
refreshwsdl="yes"
属于我的<cfinvoke>
,但我仍然遇到同样的错误。
答案 0 :(得分:2)
对于复杂的Web服务,通常更容易使用xml + cfhttp路由,就像Chester建议的那样。但是,为了回答你的问题,这些论点存在一些问题。这就是错误信息的含义。可能存在该名称的方法,但其签名与您提供的值不匹配。参数的 number 中存在不匹配,或者在这种情况下,参数的类型不匹配。
根据wsdl,start/endTime
值必须是日期。虽然CF可以隐式转换各种美国日期字符串,但它无法解析您使用的格式:yyyy-MM-ddThh:mm
。因此,要么使用date objects,要么使用&#34;可解析的&#34;,日期字符串,例如yyyy-MM-dd hh:mm:ss
。
&#34; weatherParameters&#34;参数应该是结构(或复杂类型)而不是字符串:
<cfset weather = {maxt=true}>
...
<cfinvokeargument name="weatherParameters" value="#weather#">
Product
和Unit
值的引号太多。通过使用value='"glance"'
,您实际上将双引号作为值的一部分。这可能会导致错误,因为远程Web服务希望收到glance
(没有引号)。
虽然它不会导致错误,但您不需要包含结束标记:</cfinvokeargument>
。如果您希望关闭它,使用快捷方式<cfinvokeargument ... />
通过这些更改,您的通话应按预期工作。虽然您可能需要考虑切换到createObject
,而不是cfinvoke
。然后,您可以转储Web服务对象以进行调试。它也不那么笨重的IMO。
<cfscript>
ws = createObject("webservice", "http://graphical.weather.gov/xml/SOAP_server/ndfdXMLserver.php?wsdl");
//show web service methods for debugging purposes
writeDump(ws);
// construct arguments
args = {latitude="37.94"
, longitude="-75.47"
, product="glance"
, startTime="2014-05-02 12:00:00"
, endTime="2014-05-05 12:00:00"
, Unit="e"
, weatherParameters={maxt=true}
};
// call the method
result = ws.NDFDgen(argumentCollection=args);
writeDump(result)
</cfscript>