Ошибки Coldfusion Webservice для сложных типов данных - PullRequest
2 голосов
/ 19 марта 2019

Я пытаюсь проверить веб-сервис Bloomberg для операции getFields , но выдает ошибку.

Параметры имени параметра веб-службы не могут бытьнаходится в предоставленных параметрах {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: получено фатальное предупреждение: 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 и закодированы в DER с использованием OpenSSL.На данный момент не уверен, есть ли проблема в сохраненном сертификате.

Окончательное обновление: Наконец, удалось запустить веб-сервис, используя вместо этого вызов cfhttp.Сообщение Бена Бена было превосходным гидом.Мне не удалось решить проблемы с сертификатом в хранилище ключей для 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)#">

Ответы [ 2 ]

2 голосов
/ 27 марта 2019

Удалось настроить запуск веб-службы с помощью вызова cfhttp. пост Бена был отличным руководством. Мне не удалось решить проблемы с сертификатом в хранилище ключей для метода 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 )#"
    />

2 голосов
/ 20 марта 2019

Попробуйте использовать createObject () и вызвать метод getFields ().Казалось, что он преодолел «не удается найти ошибку параметра».

<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 поддерживает синтаксис ярлыков для структур, т. Е. {})

...