Lua
Lua
Send SOAP multipart/related with XML Body and Zip Attachment
See more REST Misc Examples
Demonstrates how to construct and send a multipart/related POST containing a SOAP XML body and a binary zip attachment.Chilkat Lua Downloads
local chilkat = require("chilkat")
-- This example requires the Chilkat API to have been previously unlocked.
-- See Global Unlock Sample for sample code.
-- This example constructs and sends the following HTTP request.
-- (The boundary strings will be different and auto-generated by Chilkat)
-- Accept-Encoding: gzip,deflate
-- SOAPAction: invio
-- Content-Type: Multipart/Related; boundary="MIME_boundary"; type="text/xml"; start="mailto:rootpart@soapui.org"
-- MIME-Version: 1.0
--
-- --MIME_boundary
-- Content-Type: text/xml; charset=UTF-8
-- Content-Transfer-Encoding: 8bit
-- Content-ID: <rootpart@soapui.org>
--
-- <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:attachment.ws.it">
-- <soapenv:Header/>
-- <soapenv:Body>
-- <urn:inputBean>
-- <nomeFileAllegato>myfile.zip</nomeFileAllegato>
-- </urn:inputBean>
-- </soapenv:Body>
-- </soapenv:Envelope>
--
-- --MIME_boundary
-- Content-Type: application/zip
-- Content-Transfer-Encoding: binary
-- Content-ID: <myfile.zip>
-- Content-Disposition: attachment; name="myfile.zip"; filename="myfile.zip"
--
-- ... binary zip data goes here ...
-- --MIME_boundary--
--
local rest = chilkat.Rest.new()
rest:add_header("Accept-Encoding", "gzip,deflate")
rest:add_header("SOAPAction", "invio")
rest:add_header("Content-Type", "Multipart/Related; boundary=\"MIME_boundary\"; type=\"text/xml\"; start=\"mailto:rootpart@soapui.org\"")
rest:add_header("MIME-Version", "1.0")
-- Build the SOAP XML:
-- Use this online tool to generate the code from sample XML:
-- Generate Code to Create XML
local xml = chilkat.Xml.new()
xml.tag = "soapenv:Envelope"
xml:add_attribute("xmlns:soapenv", "http://schemas.xmlsoap.org/soap/envelope/")
xml:add_attribute("xmlns:urn", "urn:attachment.ws.it")
xml:update_child_content("soapenv:Header", "")
xml:update_child_content("soapenv:Body|urn:inputBean|nomeFileAllegato", "myfile.zip")
-- Build the SOAP XML sub-part
rest.part_selector = "1"
rest:add_header("Content-Type", "text/xml; charset=UTF-8")
rest:add_header("Content-Transfer-Encoding", "8bit")
rest:add_header("Content-ID", "<rootpart@soapui.org>")
local success = rest:set_multipart_body_string(xml:get_xml())
-- Build the sub-part containing the .zip
rest.part_selector = "2"
rest:add_header("Content-Type", "application/zip")
rest:add_header("Content-Transfer-Encoding", "binary")
rest:add_header("Content-ID", "<myfile.zip>")
rest:add_header("Content-Disposition", "attachment; name=\"myfile.zip\"; filename=\"myfile.zip\"")
-- Add a zip file to the 2nd sub-part body.
-- This example will load the .zip file into memory, but it is also possible to stream directly from the file as the request is sent
-- by calling SetMultipartBodyStream.
local bd = chilkat.BinData.new()
success = bd:load_file("qa_data/zips/helloWorld.zip")
success = rest:set_multipart_body_bd(bd)
-- To be safe, always revert the PartSelector back to 0..
rest.part_selector = "0"
-- Send the request by connecting to the web server and then sending..
-- Connect using TLS.
local bAutoReconnect = true
success = rest:connect("www.chilkatsoft.com", 443, true, bAutoReconnect)
if not success then
print(rest.last_error_text)
return
end
-- In this example, we're setting DebugMode.
-- When debug mode is turned on, no request is actually sent.
-- Instead, the request that would be sent is recorded to memory
-- and we can retrieve it afterwards..
rest.debug_mode = true
local responseStr = rest:full_request_multipart("POST", "/someTargetPath")
if not rest.last_method_success then
print(rest.last_error_text)
return
end
-- Retrieve the request that would've been sent and save it to a file.
-- We can then examine the file to see if the request was structured as we desired.
-- (Note: The zip bytes will be binary data and will appear as garbled garbage in a text editor..)
local bdRequest = chilkat.BinData.new()
rest:get_last_debug_request(bdRequest)
success = bdRequest:write_file("qa_output/multipartRelatedRequest.bin")
print("OK, examine the output file..")