【问题标题】:ColdFusion - SOAP Service Request Error "Web service operation cannot be found."ColdFusion - SOAP 服务请求错误“找不到 Web 服务操作”。
【发布时间】:2014-06-18 09:36:42
【问题描述】:

所以我对 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"

归因于我的&lt;cfinvoke&gt;,但我仍然遇到同样的错误。

【问题讨论】:

  • 这可能会对您有所帮助:forums.adobe.com/message/3189949。它基本上说您必须构建 SOAP 消息,然后通过 CFHTTP 发送它,这也是我对 SOAP Web 服务所做的。我相信只有 CFC 生成的 web 服务可以使用 CFINVOKE,但是我在任何地方都找不到。
  • 谢谢,我会试一试的。

标签: web-services soap coldfusion wsdl


【解决方案1】:

对于复杂的 Web 服务,使用 xml + cfhttp 路线通常更容易,正如 Chester 建议的那样。但是,要回答您的问题,这些论点存在一些问题。这就是错误消息的含义。该名称的方法可能存在,但其签名与您提供的值不匹配。 number 个参数不匹配,或者在这种情况下,type 个参数不匹配。

  • 根据 wsdl,start/endTime 值必须是日期。虽然 CF 可以隐式转换各种美国日期字符串,但它无法解析您使用的格式:yyyy-MM-ddThh:mm。所以要么使用date objects,要么使用“可解析”的日期字符串,例如yyyy-MM-dd hh:mm:ss

  • “weatherParameters”参数应该是结构(或复杂类型)而不是字符串:

    &lt;cfset weather = {maxt=true}&gt;
    ...
    &lt;cfinvokeargument name="weatherParameters" value="#weather#"&gt;

  • ProductUnit 值的引号过多。通过使用value='"glance"',您实际上将双引号作为值的一部分。这可能会导致错误,因为远程 Web 服务预计会收到 glance(无引号)。

  • 虽然它不会导致错误,但您不需要包含结束标签:&lt;/cfinvokeargument&gt;。如果你喜欢关闭它,使用快捷方式&lt;cfinvokeargument ... /&gt;

  • 会更干净


通过这些更改,您的通话应该可以按预期工作。尽管您可能想考虑切换到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>

【讨论】:

  • 感谢您的反馈。我今天会试试这个。
  • 您的&lt;cfscript&gt; 运行良好。在我们说话的时候,从 NOAA 那里提取了 5 天的预报。谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-05-13
  • 2023-03-26
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多