Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

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 Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.BinData,
  Chilkat.Rest,
  Chilkat.Xml;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  rest: TRest;
  xml: TXml;
  bd: TBinData;
  bAutoReconnect: Boolean;
  responseStr: string;
  bdRequest: TBinData;

begin
  success := 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--
  //  

  rest := TRest.Create;

  rest.AddHeader('Accept-Encoding','gzip,deflate');
  rest.AddHeader('SOAPAction','invio');
  rest.AddHeader('Content-Type','Multipart/Related; boundary="MIME_boundary"; type="text/xml"; start="mailto:rootpart@soapui.org"');
  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

  xml := TXml.Create;
  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="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.
  bd := TBinData.Create;
  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.
  bAutoReconnect := True;
  success := rest.Connect('www.chilkatsoft.com',443,True,bAutoReconnect);
  if (success <> True) then
    begin
      WriteLn(rest.LastErrorText);
      Exit;
    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.DebugMode := True;

  responseStr := rest.FullRequestMultipart('POST','/someTargetPath');
  if (rest.LastMethodSuccess <> True) then
    begin
      WriteLn(rest.LastErrorText);
      Exit;
    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..)
  bdRequest := TBinData.Create;
  rest.GetLastDebugRequest(bdRequest);
  success := bdRequest.WriteFile('qa_output/multipartRelatedRequest.bin');

  WriteLn('OK, examine the output file..');


  rest.Free;
  xml.Free;
  bd.Free;
  bdRequest.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.