pitazzo
pitazzo

Reputation: 1212

Building SOAP request from WSDL

I need to execute a SOAP request to an external server. I have never worked with SOAP before, but I know the basics of REST. I've been given this following WSDL file and this example query:

<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>

I'm using Postman in order to test the API. Following some instructions I found on the internet, I added a Content-Type HTTP header with value text/xml and the SOAPAction HTTP header with value consultaOperaciones as found in the WSDL file.

I've set this body:

<?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>

However, when I send the request I receive the following error message:

<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>

It's a generic SOAP error message, therefore I think that the problem has to be related to the codification instead of the external service.

Thanks in advance.

Upvotes: 2

Views: 8291

Answers (1)

Neo
Neo

Reputation: 809

In the WSDL file you will see that the XML should be sent as a string:

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

Hence the XML sent should be:

<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>

Note that we are using CDATA because as mentioned the XML message should be sent as a string based on the WSDL. I have tried running it and got the response:

<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>

This means that your message is being parsed now because there are no server errors and a consultaOperacionesResponse is being sent which looks legit. The error seems to be related to the data being sent but in general the API is working fine as expected.

Upvotes: 2

Related Questions