Построение SOAP-запроса от WSDL - PullRequest
0 голосов
/ 09 февраля 2019

Мне нужно выполнить запрос SOAP на внешний сервер.Я никогда раньше не работал с SOAP, но я знаю основы REST.Мне дали следующий WSDL-файл и этот пример запроса:

<Messages>
    <Version Ds_Version="0.0">
        <Message>
            <Detail>
                <Ds_MerchantCode>999008881</Ds_MerchantCode>
                <Ds_Terminal>1</Ds_Terminal>
                <Ds_Order>5799L</Ds_Order>
                <Ds_TransactionType>3</Ds_TransactionType>
            </Detail>
        </Message>
    </Version>
    <Signature>UfECD0KD9Wwo1iqY6PYZoJxw8KwMUz8m18bgLyH3BCI=</Signature>
    <SignatureVersion>HMAC_SHA256_V1</SignatureVersion>
</Messages>

Я использую Почтальон для тестирования API.Следуя некоторым инструкциям, которые я нашел в Интернете, я добавил заголовок HTTP Content-Type со значением text/xml и заголовок HTTP SOAPAction со значением consultaOperaciones, как указано в файле WSDL.

У меня естьустановите это тело:

<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Body xmlns:m="http://webservices.apl02.redsys.es">
        <m:consultaOperacionesRequest>
            <Messages>
                <Version Ds_Version="0.0">
                    <Message>
                        <Transaction>
                            <Ds_MerchantCode>999008881</Ds_MerchantCode>
                            <Ds_Terminal>1</Ds_Terminal>
                            <Ds_Order>5799L</Ds_Order>
                            <Ds_TransactionType>3</Ds_TransactionType>
                        </Transaction>
                    </Message>
                </Version>
                <Signature>1KoxTgTakbTprzJ2N/e9JJ8yw/C3QzeNafbUMCNGSFM=</Signature>
                <SignatureVersion>HMAC_SHA256_V1</SignatureVersion>
            </Messages>
        </m:consultaOperacionesRequest>
    </soap:Body>
</soap:Envelope>

Однако, когда я отправляю запрос, я получаю следующее сообщение об ошибке:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Header/>
    <soapenv:Body>
        <soapenv:Fault>
            <faultcode>Server</faultcode>
            <faultstring>Internal Error</faultstring>
        </soapenv:Fault>
    </soapenv:Body>
</soapenv:Envelope>

Это общее сообщение об ошибке SOAP, поэтому я думаю, что проблема имеетБыть связанным с кодификацией вместо внешней службы.

Заранее спасибо.

1 Ответ

0 голосов
/ 09 февраля 2019

В файле WSDL вы увидите, что XML должен быть отправлен в виде строки:

<element name="consultaOperaciones">
    <complexType>
        <sequence>
            <element name="cadenaXML" nillable="true" type="xsd:string"/>
        </sequence>
    </complexType>
</element>

Следовательно, отправляемый XML должен быть:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservices.apl02.redsys.es">
   <soapenv:Header/>
   <soapenv:Body>
      <web:consultaOperaciones>
         <cadenaXML><![CDATA[
         <Messages>
    <Version Ds_Version="0.0">
        <Message>
            <Detail>
                <Ds_MerchantCode>999008881</Ds_MerchantCode>
                <Ds_Terminal>1</Ds_Terminal>
                <Ds_Order>5799L</Ds_Order>
                <Ds_TransactionType>3</Ds_TransactionType>
            </Detail>
        </Message>
    </Version>
    <Signature>UfECD0KD9Wwo1iqY6PYZoJxw8KwMUz8m18bgLyH3BCI=</Signature>
    <SignatureVersion>HMAC_SHA256_V1</SignatureVersion>
</Messages>
         ]]>
         </cadenaXML>
      </web:consultaOperaciones>
   </soapenv:Body>
</soapenv:Envelope>

Обратите внимание, что мы используемCDATA, потому что, как уже упоминалось, сообщение XML следует отправлять в виде строки на основе WSDL.Я попытался запустить его и получил ответ:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Header/>
   <soapenv:Body>
      <p259:consultaOperacionesResponse xmlns:p259="http://webservices.apl02.redsys.es">
         <consultaOperacionesReturn><![CDATA[<Messages><Version Ds_Version="0.0"><Message><ErrorMsg><Ds_ErrorCode>XML0023</Ds_ErrorCode></ErrorMsg></Message></Version></Messages>]]></consultaOperacionesReturn>
      </p259:consultaOperacionesResponse>
   </soapenv:Body>
</soapenv:Envelope>

Это означает, что ваше сообщение анализируется сейчас, потому что нет ошибок сервера и отправляется consultaOperacionesResponse, который выглядит законным.Кажется, ошибка связана с отправляемыми данными, но в целом API работает нормально, как и ожидалось.

...