# SOAP Example

> [HTML Version](soapexample.htm)

_Added June 2013_

SOAP requests may be formed by combining an XML-format document (based on the requirements for the web service as defined in the WSDL for the service) with a set of HTTP binding headers. The technique is essentially the same as described in Customizing POST headers, except that the Content-Type may be different and typically you will be adding a SOAPAction header. The following is a an example of a real web service (as of June 2013) provided by WebserviceX.NET which returns details about airports based on the airport code. The format of the XML request document is as follows:

<?xml version="1.0" encoding="utf-8"?>

<soap:Envelope xmlns:xsi=["http://www.w3.org/2001/XMLSchema-instance"](http://www.w3.org/2001/XMLSchema-instance) xmlns:xsd=["http://www.w3.org/2001/XMLSchema"](http://www.w3.org/2001/XMLSchema) xmlns:soap=["http://schemas.xmlsoap.org/soap/envelope/"](http://schemas.xmlsoap.org/soap/envelope/)>

  <soap:Body>

    <getAirportInformationByAirportCode xmlns=["http://www.webserviceX.NET"](http://www.webserviceX.NET)>

       <airportCode>\$AIRPORTCODE\$</airportCode>

    </getAirportInformationByAirportCode>

  </soap:Body>

</soap:Envelope>



To generate an actual request, we copy the above into a file, replacing the \$AIRPORTCODE\$ with the actual code (see CGIUTL for one technique to simply such replacements). In order to specify the desired Content-Type and the SOAPAction header, we insert it at the top of our file, followed by a blank line and then the XML request:

Content-Type: text/xml; charset=utf-8

SOAPAction: ["http://www.webserviceX.NET/getAirportInformationByAirportCode"](http://www.webserviceX.NET/getAirportInformationByAirportCode)



<xml doc here>



Assuming that our generated request file is called "airport.req", we can then call the web service as follows:

flags = XHTTPF\_REQPOST                               \! POST request (typical for SOAP)

flags = flags or XHTTPF\_FILEREQ or XHTTPF\_FILERESP   \! request and response are both filespecs

flags = flags or XHTTPF\_HDRBODY                      \! request body contains header lines

url = ["http://www.webserviceX.NET/airport.asmx"](http://www.webserviceX.NET/airport.asmx)

xcall HTTP, 1, status, flags, url, "airport.req", "airport.rsp"



To examine the final headers as sent to the service, add the XHTTPF\_DEBUG flag and then check the resulting debug.req file, which should look something like:

POST /airport.asmx HTTP/1.1

Host: [www.webservicex.net](http://www.webservicex.net)

Content-Type: text/xml; charset="utf-8"

SOAPAction: ["http://www.webserviceX.NET/getAirportInformationByAirportCode"](http://www.webserviceX.NET/getAirportInformationByAirportCode)

Content-Length: 418



<?xml version="1.0" encoding="utf-8"?>

<soap:Envelope xmlns:xsi=["http://www.w3.org/2001/XMLSchema-instance"](http://www.w3.org/2001/XMLSchema-instance) xmlns:xsd=["http://www.w3.org/2001/XMLSchema"](http://www.w3.org/2001/XMLSchema)

               xmlns:soap=["http://schemas.xmlsoap.org/soap/envelope/"](http://schemas.xmlsoap.org/soap/envelope/)>

  <soap:Body>

    <getAirportInformationByAirportCode xmlns=["http://www.webserviceX.NET"](http://www.webserviceX.NET)>

      <airportCode>LAX</airportCode>

    </getAirportInformationByAirportCode>

  </soap:Body>

</soap:Envelope>



Note that the POST, Host:, and Content-Length headers are added automatically, but the Content-Type and SOAPAction headers are copied from the request file.

The program [AIRPORT in EXLIB:\[908,25\]](https://bitbucket.org/microsabio/exlib/src/master/908025/airport.bp) demonstrates this service. 

