Sample code for 30+ languages & platforms
B4X

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

B4X
Dim success As Boolean = False

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

Dim rest As ChilkatRest
rest.Initialize("rest")

rest.AddHeader("Accept-Encoding", "gzip,deflate")
rest.AddHeader("SOAPAction", "invio")
rest.AddHeader("Content-Type", "Multipart/Related; boundary=" & Chr(34) & "MIME_boundary" & Chr(34) & "; type=" & Chr(34) & "text/xml" & Chr(34) & "; start=" & Chr(34) & "mailto:rootpart@soapui.org" & Chr(34))
rest.AddHeader("MIME-Version", "1.0")

'  Build the SOAP XML:
'  Use this online tool to generate the code from sample XML: 
'  Generate Code to Create XML

Dim xml As ChilkatXml
xml.Initialize
xml.Tag = "soapenv:Envelope"
xml.AddAttribute("xmlns:soapenv", "http://schemas.xmlsoap.org/soap/envelope/")
xml.AddAttribute("xmlns:urn", "urn:attachment.ws.it")
xml.UpdateChildContent("soapenv:Header", "")
xml.UpdateChildContent("soapenv:Body|urn:inputBean|nomeFileAllegato", "myfile.zip")

'  Build the SOAP XML sub-part
rest.PartSelector = "1"
rest.AddHeader("Content-Type", "text/xml; charset=UTF-8")
rest.AddHeader("Content-Transfer-Encoding", "8bit")
rest.AddHeader("Content-ID", "<rootpart@soapui.org>")
success = rest.SetMultipartBodyString(xml.GetXml)

'  Build the sub-part containing the .zip
rest.PartSelector = "2"
rest.AddHeader("Content-Type", "application/zip")
rest.AddHeader("Content-Transfer-Encoding", "binary")
rest.AddHeader("Content-ID", "<myfile.zip>")
rest.AddHeader("Content-Disposition", "attachment; name=" & Chr(34) & "myfile.zip" & Chr(34) & "; filename=" & Chr(34) & "myfile.zip" & Chr(34))

'  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.
Dim bd As ChilkatBinData
bd.Initialize
success = bd.LoadFile("qa_data/zips/helloWorld.zip")
success = rest.SetMultipartBodyBd(bd)

'  To be safe, always revert the PartSelector back to 0..
rest.PartSelector = "0"

'  Send the request by connecting to the web server and then sending..
'  Connect using TLS.
Dim bAutoReconnect As Boolean = True
success = rest.Connect("www.chilkatsoft.com", 443, True, bAutoReconnect)
If success <> True Then
    Log(rest.LastErrorText)
    Return
End If


'  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.DebugMode = True

Dim responseStr As String = rest.FullRequestMultipart("POST", "/someTargetPath")
If rest.LastMethodSuccess <> True Then
    Log(rest.LastErrorText)
    Return
End If


'  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..)
Dim bdRequest As ChilkatBinData
bdRequest.Initialize
rest.GetLastDebugRequest(bdRequest)
success = bdRequest.WriteFile("qa_output/multipartRelatedRequest.bin")

Log("OK, examine the output file..")