复杂数据类型的 Coldfusion Webservice 错误
Coldfusion Webservice errors for complex data types
我正在尝试为 getFields 操作测试 Bloomberg webservice,但它抛出错误。
Web service parameter name parameters cannot be found in the provided parameters {CRITERIA}.
到目前为止的代码。
<cfset FieldSearchCriteria = structNew()>
<cfset FieldSearchCriteria.mnemonic = "NAME">
<cfset GetFieldsRequest = structNew()>
<cfset getFieldsRequest.criteria = FieldSearchCriteria>
<cfinvoke
webservice="https://service.bloomberg.com/assets/dl/dlws.wsdl"
proxyserver="***"
proxyport="***"
proxyuser="***"
proxypassword="***"
method="getFields"
refreshwsdl="false"
wsVersion="1"
argumentcollection="#getFieldsRequest#"
returnvariable="aTemp">
<cfdump var="#aTemp#">
下面是有效的相应 soapUI 请求
<soapenv:Body>
<ns:getFieldsRequest>
<ns:criteria>
<!--Optional:-->
<ns:mnemonic>NAME</ns:mnemonic>
</ns:criteria>
</ns:getFieldsRequest>
有什么指点吗?
更新 1: createobject() 在一定程度上随着参数的变化而工作。但是现在抛出握手错误。
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
代码:
<cfscript>
ws = createObject("webservice", "https://service.bloomberg.com/assets/dl/dlws.wsdl",{refreshwsdl=true,proxyserver="***",proxyport="***",proxyuser="***",proxypassword="***",wsversion=1});
//show web service methods for debugging purposes
//writeDump(ws);
// construct arguments
args = {parameters={criteria={mnemonic="NAME"}}
};
writeDump(args);
// call the method
result = ws.getFields(argumentCollection=args);
writeDump(result)
</cfscript>
我们获得了 x.509 .p12 证书并使用 OpenSSL 编码为 DER。
目前,不确定存储的证书是否有问题。
最终更新:
最后,设法使用 cfhttp 调用来创建 Web 服务 运行。
Ben 的 blog post 是一位出色的向导。我无法解决 cfinvoke
.
的密钥库的证书问题
<cfsavecontent variable="soapBody">
<soapenv:Envelope
xxmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns="http://services.bloomberg.com/datalicense/dlws/ps/20071001">
<soapenv:Header/>
<soapenv:Body>
<ns:getFieldsRequest>
<ns:criteria>
<!--Optional:-->
<ns:mnemonic>NAME</ns:mnemonic>
</ns:criteria>
</ns:getFieldsRequest>
</soapenv:Body>
</soapenv:Envelope>
<cfhttp
url="https://dlws.bloomberg.com/dlps"
method="post"
result="httpResponse"
clientcert="#ExpandPath(".")#\cert.p12"
clientcertpassword="****">
<!---
Most SOAP action require some sort of SOAP Action header
to be used.
--->
<cfhttpparam
type="header"
name="SOAPAction"
value="""getFields"""
/>
<cfhttpparam
type="xml"
value="#trim( soapBody )#"
/>
</cfhttp>
<cfdump var="#XmlParse(httpResponse.filecontent)#">
尝试使用 createObject() 并改为调用 getFields() 方法。好像过了"cannot find parameter error".
<cfset svc = createObject("webservice"
, "https://service.bloomberg.com/assets/dl/dlws.wsdl"
, {wsVersion=1}
)>
<cfset getFieldsRequest = {criteria={mnemonic="NAME"}}>
<cfset result = svc.getFields(getFieldsRequest)>
<cfdump var="#result#">
(与问题无关,但 CF11 支持结构的快捷语法,即 {}
)
设法使用 cfhttp
调用来创建 Web 服务 运行。 Ben 的 blog post 是一位出色的向导。我无法解决 cfinvoke
方法的密钥库的证书问题。
<cfsavecontent variable="soapBody">
<soapenv:Envelope
xxmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns="http://services.bloomberg.com/datalicense/dlws/ps/20071001">
<soapenv:Header/>
<soapenv:Body>
<ns:getFieldsRequest>
<ns:criteria>
<!--Optional:-->
<ns:mnemonic>NAME</ns:mnemonic>
</ns:criteria>
</ns:getFieldsRequest>
</soapenv:Body>
</soapenv:Envelope>
<cfhttp
url="https://dlws.bloomberg.com/dlps"
method="post"
result="httpResponse"
clientcert="#ExpandPath(".")#\cert.p12"
clientcertpassword="****">
<!---
Most SOAP action require some sort of SOAP Action header
to be used.
--->
<cfhttpparam
type="header"
name="SOAPAction"
value="""getFields""" <!--- Note : extra pair of quotes are required --->
/>
<cfhttpparam
type="xml"
value="#trim( soapBody )#"
/>
我正在尝试为 getFields 操作测试 Bloomberg webservice,但它抛出错误。
Web service parameter name parameters cannot be found in the provided parameters {CRITERIA}.
到目前为止的代码。
<cfset FieldSearchCriteria = structNew()>
<cfset FieldSearchCriteria.mnemonic = "NAME">
<cfset GetFieldsRequest = structNew()>
<cfset getFieldsRequest.criteria = FieldSearchCriteria>
<cfinvoke
webservice="https://service.bloomberg.com/assets/dl/dlws.wsdl"
proxyserver="***"
proxyport="***"
proxyuser="***"
proxypassword="***"
method="getFields"
refreshwsdl="false"
wsVersion="1"
argumentcollection="#getFieldsRequest#"
returnvariable="aTemp">
<cfdump var="#aTemp#">
下面是有效的相应 soapUI 请求
<soapenv:Body>
<ns:getFieldsRequest>
<ns:criteria>
<!--Optional:-->
<ns:mnemonic>NAME</ns:mnemonic>
</ns:criteria>
</ns:getFieldsRequest>
有什么指点吗?
更新 1: createobject() 在一定程度上随着参数的变化而工作。但是现在抛出握手错误。
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
代码:
<cfscript>
ws = createObject("webservice", "https://service.bloomberg.com/assets/dl/dlws.wsdl",{refreshwsdl=true,proxyserver="***",proxyport="***",proxyuser="***",proxypassword="***",wsversion=1});
//show web service methods for debugging purposes
//writeDump(ws);
// construct arguments
args = {parameters={criteria={mnemonic="NAME"}}
};
writeDump(args);
// call the method
result = ws.getFields(argumentCollection=args);
writeDump(result)
</cfscript>
我们获得了 x.509 .p12 证书并使用 OpenSSL 编码为 DER。 目前,不确定存储的证书是否有问题。
最终更新:
最后,设法使用 cfhttp 调用来创建 Web 服务 运行。
Ben 的 blog post 是一位出色的向导。我无法解决 cfinvoke
.
<cfsavecontent variable="soapBody">
<soapenv:Envelope
xxmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns="http://services.bloomberg.com/datalicense/dlws/ps/20071001">
<soapenv:Header/>
<soapenv:Body>
<ns:getFieldsRequest>
<ns:criteria>
<!--Optional:-->
<ns:mnemonic>NAME</ns:mnemonic>
</ns:criteria>
</ns:getFieldsRequest>
</soapenv:Body>
</soapenv:Envelope>
<cfhttp
url="https://dlws.bloomberg.com/dlps"
method="post"
result="httpResponse"
clientcert="#ExpandPath(".")#\cert.p12"
clientcertpassword="****">
<!---
Most SOAP action require some sort of SOAP Action header
to be used.
--->
<cfhttpparam
type="header"
name="SOAPAction"
value="""getFields"""
/>
<cfhttpparam
type="xml"
value="#trim( soapBody )#"
/>
</cfhttp>
<cfdump var="#XmlParse(httpResponse.filecontent)#">
尝试使用 createObject() 并改为调用 getFields() 方法。好像过了"cannot find parameter error".
<cfset svc = createObject("webservice"
, "https://service.bloomberg.com/assets/dl/dlws.wsdl"
, {wsVersion=1}
)>
<cfset getFieldsRequest = {criteria={mnemonic="NAME"}}>
<cfset result = svc.getFields(getFieldsRequest)>
<cfdump var="#result#">
(与问题无关,但 CF11 支持结构的快捷语法,即 {}
)
设法使用 cfhttp
调用来创建 Web 服务 运行。 Ben 的 blog post 是一位出色的向导。我无法解决 cfinvoke
方法的密钥库的证书问题。
<cfsavecontent variable="soapBody">
<soapenv:Envelope
xxmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns="http://services.bloomberg.com/datalicense/dlws/ps/20071001">
<soapenv:Header/>
<soapenv:Body>
<ns:getFieldsRequest>
<ns:criteria>
<!--Optional:-->
<ns:mnemonic>NAME</ns:mnemonic>
</ns:criteria>
</ns:getFieldsRequest>
</soapenv:Body>
</soapenv:Envelope>
<cfhttp
url="https://dlws.bloomberg.com/dlps"
method="post"
result="httpResponse"
clientcert="#ExpandPath(".")#\cert.p12"
clientcertpassword="****">
<!---
Most SOAP action require some sort of SOAP Action header
to be used.
--->
<cfhttpparam
type="header"
name="SOAPAction"
value="""getFields""" <!--- Note : extra pair of quotes are required --->
/>
<cfhttpparam
type="xml"
value="#trim( soapBody )#"
/>