如何调用此Web服务方法?

时间:2011-06-13 12:50:57

标签: web-services coldfusion wsdl

我无法绕过调用第三方服务的简单方法。以下是此方法的WSDL块:

<s:element name="PushRequest">
    <s:complexType>
        <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="LocationCode" type="s:string"/>
            <s:element minOccurs="0" maxOccurs="1" name="PushRequestXml" type="s:string"/>
            <s:element minOccurs="0" maxOccurs="1" name="PassPhrase" type="s:string"/>
        </s:sequence>
    </s:complexType>
</s:element>

这是一个SOAP 1.1请求示例,由web-service生成:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <PushRequest xmlns="http://xxxx.yyyy.com/">
      <LocationCode>string</LocationCode>
      <PushRequestXml>string</PushRequestXml>
      <PassPhrase>string</PassPhrase>
    </PushRequest>
  </soap:Body>
</soap:Envelope>

首先我认为这是一个复杂类型的论证,所以我试过这个:

ws = CreateObject("webservice", serviceURL);

push = {};
push["LocationCode"] = "xxx";
push["PushRequestXml"] = "yyy";
push["PassPhrase"] = "zzz";

responseXML = ws.PushRequest(push);

但得到了通常的CF回复Web service operation PushRequest with parameters {{PushRequestXml={yyy},LocationCode={xxx},PassPhrase={zzz}}} cannot be found.

接下来我认为这可能不是一个复杂的参数(至少它在XML中没有name属性),而是三个不同的参数:

ws = CreateObject("webservice", serviceURL);

responseXML = ws.PushRequest(LocationCode = "xxx", PushRequestXml = "yyy", PassPhrase = "zzz");

结果相同:Web service operation PushRequest with parameters {PushRequestXml={{PushRequestXml, yyy}},LocationCode={{LocationCode, xxx}},PassPhrase={{PassPhrase, zzz}}} cannot be found.

有任何想法应如何处理?请告诉我们是否需要更多信息。

我正在使用ACF9,网络服务由ASP.net提供

感谢。

3 个答案:

答案 0 :(得分:2)

我最终使用普通的POST原始XML来处理Web服务并手动解析响应XML,如this blog post中所提议的那样。

此外,我已经尝试过wsdl2java,正如该博客系列的第3部分所提出的那样,但它没有帮助我 - 方法看起来与之前完全一样:

public java.lang.String pushRequest(java.lang.String locationCode, java.lang.String pushRequestXml, java.lang.String passPhrase) throws java.rmi.RemoteException;

因此,我没有找到适用于我的网络服务的cfinvoke的方法。

因此,我当前的请求代码如下所示:

<cfsavecontent variable="SOAPXML">
<cfoutput>
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <PushRequest xmlns="http://serviceurl.com/">
      <LocationCode>#LocationCode#</LocationCode>
      <PushRequestXml>#XMLFormat(Trim(PushRequestXml))#</PushRequestXml>
      <PassPhrase>#PassPhrase#</PassPhrase>
    </PushRequest>
  </soap:Body>
</soap:Envelope>
</cfoutput>
</cfsavecontent>

<cfhttp method="post" url="#ServiceURL#">
    <cfhttpparam type="header" name="SOAPAction" value="http://serviceurl.com/PushRequest" />
    <cfhttpparam type="xml" value="#Trim(SOAPXML)#" />
</cfhttp>

服务返回XML,因此处理它不是问题。

答案 1 :(得分:0)

您是否尝试过使用CFBuilder,并将serviceURL粘贴到服务浏览器(显示Web服务 - > +)中,然后右键单击它以生成正确的createObject()调用?

Services Browser in CFBuilder 2

答案 2 :(得分:0)

我不是WSDL的大师,但我似乎记得自动生成的WSDL通常以“请求”或“响应”为后缀,因此您可能需要简单地调用“推送”而不是“推送请求”。

ws = CreateObject("webservice", serviceURL);

push = {};
push["LocationCode"] = "xxx";
push["PushRequestXml"] = "yyy";
push["PassPhrase"] = "zzz";

responseXML = ws.Push(push);
值得一试。