我无法绕过调用第三方服务的简单方法。以下是此方法的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提供
感谢。
答案 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()调用?
答案 2 :(得分:0)
我不是WSDL的大师,但我似乎记得自动生成的WSDL通常以“请求”或“响应”为后缀,因此您可能需要简单地调用“推送”而不是“推送请求”。
ws = CreateObject("webservice", serviceURL);
push = {};
push["LocationCode"] = "xxx";
push["PushRequestXml"] = "yyy";
push["PassPhrase"] = "zzz";
responseXML = ws.Push(push);
值得一试。