Sample code for 30+ languages & platforms
Lua

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

Lua
local chilkat = require("chilkat")

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

local rest = chilkat.Rest.new()

-- 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).
local bTls = false
local port = 80
local bAutoReconnect = true
-- In this particular case, it is important to connect to "wsf.cdyne.com", not "ws.cdyne.com"...
local success = rest:connect("wsf.cdyne.com", port, bTls, bAutoReconnect)
if not success then
    print(rest.last_error_text)
    return
end

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

-- Build the SOAP XML request body.
local soapXml = chilkat.Xml.new()

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

soapXml:new_child2("soap:Body", "")
success = soapXml:get_child2(0)
soapXml:new_child2("GetCityWeatherByZIP", "")
success = soapXml:get_child2(0)
success = soapXml:add_attribute("xmlns", "http://ws.cdyne.com/WeatherWS/")
soapXml:new_child2("ZIP", "60187")
soapXml:get_root2()

print(soapXml:get_xml())

-- Send the SOAP request
local responseXml = rest:full_request_string("POST", "/WeatherWS/Weather.asmx", soapXml:get_xml())
if not rest.last_method_success then
    print(rest.last_error_text)
    return
end

-- When successful, the response status code will equal 200.
if rest.response_status_code ~= 200 then
    -- Examine the request/response to see what happened.
    print("response status code = " .. rest.response_status_code)
    print("response status text = " .. rest.response_status_text)
    print("response header: " .. rest.response_header)
    print("response body (if any): " .. responseXml)
    print("---")
    print("LastRequestStartLine: " .. rest.last_request_start_line)
    print("LastRequestHeader: " .. rest.last_request_header)
    return
end

local xml = chilkat.Xml.new()
success = xml:load_xml(responseXml)

-- GetXml will emit XML that is nicely indented for human viewing..
print(xml:get_xml())

-- A sample response XML is shown below...

-- To get some information, use ChilkatPath.  For example...
print("Temperature: " .. xml:chilkat_path("soap:Body|GetCityWeatherByZIPResponse|GetCityWeatherByZIPResult|Temperature|*"))

print("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>