Sample code for 30+ languages & platforms
PureBasic

Making SOAP Requests using the REST API

See more REST Examples

There's no reason a SOAP request cannot be sent using the REST API. It's only a matter of adding a SOAP specific header, and providing the SOAP XML request body. The response body is the SOAP response XML.

This example sends a request to ws.cdyne.com to get city weather by zip code.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkRest.pb"
IncludeFile "CkXml.pb"

Procedure ChilkatExample()

    success.i = 0

    ; Demonstrates how to do a SOAP request using the REST API.

    ; This example requires the Chilkat API to have been previously unlocked.
    ; See Global Unlock Sample for sample code.

    ; --------------------------------------------------------------------------------
    ; Also see Chilkat's Online WSDL Code Generator
    ; to generate code and SOAP Request and Response XML for each operation in a WSDL.
    ; --------------------------------------------------------------------------------

    rest.i = CkRest::ckCreate()
    If rest.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; This is the request to be sent:

    ; POST /WeatherWS/Weather.asmx HTTP/1.1
    ; Host: wsf.cdyne.com
    ; Content-Type: text/xml; charset=utf-8
    ; Content-Length: length
    ; SOAPAction: "http://ws.cdyne.com/WeatherWS/GetCityWeatherByZIP"
    ; 
    ; <?xml version="1.0" encoding="utf-8"?>
    ; <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    ;   <soap:Body>
    ;     <GetCityWeatherByZIP xmlns="http://ws.cdyne.com/WeatherWS/">
    ;       <ZIP>string</ZIP>
    ;     </GetCityWeatherByZIP>
    ;   </soap:Body>
    ; </soap:Envelope>

    ; Note: The application does not need to set the Host or Content-Length headers.
    ; Chilkat will automatically add these headers.

    ; Make the initial connection (without sending a request yet).
    bTls.i = 0
    port.i = 80
    bAutoReconnect.i = 1
    ; In this particular case, it is important to connect to "wsf.cdyne.com", not "ws.cdyne.com"...
    success = CkRest::ckConnect(rest,"wsf.cdyne.com",port,bTls,bAutoReconnect)
    If success <> 1
        Debug CkRest::ckLastErrorText(rest)
        CkRest::ckDispose(rest)
        ProcedureReturn
    EndIf

    ; Add request headers:
    success = CkRest::ckAddHeader(rest,"Content-Type","text/xml; charset=utf-8")
    success = CkRest::ckAddHeader(rest,"SOAPAction","http://ws.cdyne.com/WeatherWS/GetCityWeatherByZIP")

    ; Build the SOAP XML request body.
    soapXml.i = CkXml::ckCreate()
    If soapXml.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkXml::setCkTag(soapXml, "soap:Envelope")
    success = CkXml::ckAddAttribute(soapXml,"xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance")
    success = CkXml::ckAddAttribute(soapXml,"xmlns:xsd","http://www.w3.org/2001/XMLSchema")
    success = CkXml::ckAddAttribute(soapXml,"xmlns:soap","http://schemas.xmlsoap.org/soap/envelope/")

    CkXml::ckNewChild2(soapXml,"soap:Body","")
    success = CkXml::ckGetChild2(soapXml,0)
    CkXml::ckNewChild2(soapXml,"GetCityWeatherByZIP","")
    success = CkXml::ckGetChild2(soapXml,0)
    success = CkXml::ckAddAttribute(soapXml,"xmlns","http://ws.cdyne.com/WeatherWS/")
    CkXml::ckNewChild2(soapXml,"ZIP","60187")
    CkXml::ckGetRoot2(soapXml)

    Debug CkXml::ckGetXml(soapXml)

    ; Send the SOAP request
    responseXml.s = CkRest::ckFullRequestString(rest,"POST","/WeatherWS/Weather.asmx",CkXml::ckGetXml(soapXml))
    If CkRest::ckLastMethodSuccess(rest) <> 1
        Debug CkRest::ckLastErrorText(rest)
        CkRest::ckDispose(rest)
        CkXml::ckDispose(soapXml)
        ProcedureReturn
    EndIf

    ; When successful, the response status code will equal 200.
    If CkRest::ckResponseStatusCode(rest) <> 200
        ; Examine the request/response to see what happened.
        Debug "response status code = " + Str(CkRest::ckResponseStatusCode(rest))
        Debug "response status text = " + CkRest::ckResponseStatusText(rest)
        Debug "response header: " + CkRest::ckResponseHeader(rest)
        Debug "response body (if any): " + responseXml
        Debug "---"
        Debug "LastRequestStartLine: " + CkRest::ckLastRequestStartLine(rest)
        Debug "LastRequestHeader: " + CkRest::ckLastRequestHeader(rest)
        CkRest::ckDispose(rest)
        CkXml::ckDispose(soapXml)
        ProcedureReturn
    EndIf

    xml.i = CkXml::ckCreate()
    If xml.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkXml::ckLoadXml(xml,responseXml)

    ; GetXml will emit XML that is nicely indented for human viewing..
    Debug CkXml::ckGetXml(xml)

    ; A sample response XML is shown below...

    ; To get some information, use ChilkatPath.  For example...
    Debug "Temperature: " + CkXml::ckChilkatPath(xml,"soap:Body|GetCityWeatherByZIPResponse|GetCityWeatherByZIPResult|Temperature|*")

    Debug "Success."

    ; <?xml version="1.0" encoding="utf-8" ?>
    ; <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    ;     <soap:Body>
    ;         <GetCityWeatherByZIPResponse xmlns="http://ws.cdyne.com/WeatherWS/">
    ;             <GetCityWeatherByZIPResult>
    ;                 <Success>true</Success>
    ;                 <ResponseText>City Found</ResponseText>
    ;                 <State>IL</State>
    ;                 <City>Wheaton</City>
    ;                 <WeatherStationCity>West Chicago</WeatherStationCity>
    ;                 <WeatherID>10</WeatherID>
    ;                 <Description>Mostly Sunny</Description>
    ;                 <Temperature>33</Temperature>
    ;                 <RelativeHumidity>39</RelativeHumidity>
    ;                 <Wind>VRB5</Wind>
    ;                 <Pressure>30.33F</Pressure>
    ;                 <Visibility />
    ;                 <WindChill />
    ;                 <Remarks />
    ;             </GetCityWeatherByZIPResult>
    ;         </GetCityWeatherByZIPResponse>
    ;     </soap:Body>
    ; </soap:Envelope>


    CkRest::ckDispose(rest)
    CkXml::ckDispose(soapXml)
    CkXml::ckDispose(xml)


    ProcedureReturn
EndProcedure