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

Simple SOAP Request

See more HTTP Examples

Demonstrates how to send a simple SOAP request.

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.Http,
  Chilkat.HttpResponse,
  Chilkat.Xml;

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

procedure RunDemo;
var
  success: Boolean;
  xml: TXml;
  soapRequestBody: string;
  endpoint: string;
  soapAction: string;
  contentType: string;
  http: THttp;
  resp: THttpResponse;
  responseXml: TXml;
  statusCode: Integer;
  dat_NumberToDollarsResult: string;

begin
  success := False;

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

  //  Create the following XML to be sent in the SOAP request body.

  //  <soapenv:Envelope xmlns:dat="http://www.dataaccess.com/webservicesserver/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  //      <soapenv:Header/>
  //      <soapenv:Body>
  //          <dat:NumberToDollars>
  //              <dat:dNum>99.0</dat:dNum>
  //          </dat:NumberToDollars>
  //      </soapenv:Body>
  //  </soapenv:Envelope>

  xml := TXml.Create;
  xml.Tag := 'soapenv:Envelope';
  xml.AddAttribute('xmlns:dat','http://www.dataaccess.com/webservicesserver/');
  xml.AddAttribute('xmlns:soapenv','http://schemas.xmlsoap.org/soap/envelope/');
  xml.UpdateChildContent('soapenv:Header','');
  xml.UpdateChildContent('soapenv:Body|dat:NumberToDollars|dat:dNum','99.0');

  //  In a SOAP HTTP request, including the XML declaration (<?xml version="1.0" encoding="UTF-8"?>) in the XML body is generally not required. 
  xml.EmitXmlDecl := False;
  soapRequestBody := xml.GetXml();

  endpoint := 'https://www.dataaccess.com/webservicesserver/numberconversion.wso';
  soapAction := '';
  //   For SOAP requests, the standard Content-Type is usually set to "text/xml" or "application/soap+xml"
  contentType := 'text/xml';

  http := THttp.Create;

  http.ClearHeaders();
  http.SetRequestHeader('SOAPAction',soapAction);

  resp := THttpResponse.Create;
  success := http.HttpStr('POST',endpoint,soapRequestBody,'utf-8',contentType,resp);
  if (success = False) then
    begin
      WriteLn(http.LastErrorText);
      Exit;
    end;

  //  Get the XML response body.
  responseXml := TXml.Create;
  resp.GetBodyXml(responseXml);

  statusCode := resp.StatusCode;
  WriteLn('response status code: ' + statusCode);

  //  If the status code does not indicate succcess, then show the response XML,
  //  which probably contains error information.
  if (statusCode <> 200) then
    begin
      WriteLn(responseXml.GetXml());
      Exit;
    end;

  WriteLn(responseXml.GetXml());

  //  Parse the successful SOAP response XML.

  //  This is a sample of the response XML, but the namespace prefixes will be different.
  //  We can parse the result using "*" for the namespace prefixes (see below).

  //  <soapenv:Envelope xmlns:dat="http://www.dataaccess.com/webservicesserver/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  //      <soapenv:Header/>
  //      <soapenv:Body>
  //          <dat:NumberToDollarsResponse>
  //              <dat:NumberToDollarsResult>string</dat:NumberToDollarsResult>
  //          </dat:NumberToDollarsResponse>
  //      </soapenv:Body>
  //  </soapenv:Envelope>

  dat_NumberToDollarsResult := responseXml.GetChildContent('*:Body|*:NumberToDollarsResponse|*:NumberToDollarsResult');
  WriteLn('result: ' + dat_NumberToDollarsResult);


  xml.Free;
  http.Free;
  resp.Free;
  responseXml.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.