Sample code for 30+ languages & platforms
Delphi DLL

Belgium eHealth Platform - AddressBook - Search for Professionals

See more Belgian eHealth Platform Examples

Demonstrates how to search for professionals using the AddressBook API.

Chilkat Delphi DLL Downloads

Delphi DLL
uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, CkDateTime, HttpResponse, BinData, Cert, Http, Xml;

...

procedure TForm1.Button1Click(Sender: TObject);
var
success: Boolean;
cert: HCkCert;
bdSecToken: HCkBinData;
startIdx: Integer;
endIdx: Integer;
base64_saml_token: PWideChar;
xml: HCkXml;
dt: HCkDateTime;
http: HCkHttp;
xmlStr: PWideChar;
resp: HCkHttpResponse;

begin
success := False;

// This example assumes 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.
// --------------------------------------------------------------------------------

// Provide a certificate + private key.
// Note: If your certificate + private key is located on a hardware token or smartcard, you can call a different function to load from smartcard..
cert := CkCert_Create();
success := CkCert_LoadPfxFile(cert,'SSIN=12345678.acc.p12','p12_password');
if (success = False) then
  begin
    Memo1.Lines.Add(CkCert__lastErrorText(cert));
    Exit;
  end;

// Let's get the SAML Security Token obtained from https://services-acpt.ehealth.fgov.be/IAM/SecurityTokenService/v1/RequestSecurityToken
// a very short time ago..

// See this example for how we got the SAML security token: eHealth Belgium Request Security Token
bdSecToken := CkBinData_Create();
success := CkBinData_LoadFile(bdSecToken,'qa_data/tokens/ehealth-fgov-be-sectoken.xml');
if (success = False) then
  begin
    Memo1.Lines.Add('Failed to load SAML security token');
    Exit;
  end;

// The SAML security token is just the part from <Assertion ..> ... </Assertion>
// So let's get just that part..
startIdx := CkBinData_FindString(bdSecToken,'<Assertion',0,'utf-8');
if (startIdx < 0) then
  begin
    Memo1.Lines.Add('Did not find the start of the SAML assertion.');
    Exit;
  end;
endIdx := CkBinData_FindString(bdSecToken,'</Assertion>',0,'utf-8');
if (endIdx < 0) then
  begin
    Memo1.Lines.Add('Did not find the end of the SAML assertion.');
    Exit;
  end;

// Adjust the index to the 1st byte after "</Assertion>"
endIdx := endIdx + 12;
base64_saml_token := CkBinData__getEncodedChunk(bdSecToken,startIdx,endIdx - startIdx,'base64');

Memo1.Lines.Add(base64_saml_token);

// Our SOAP request will look like this:

// The SOAP request to search for professionals looks like this:

// <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:add="urn:be:fgov:ehealth:addressbook:protocol:v1">
//     <soapenv:Header>
// 	      <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
// 	         <wsse:BinarySecurityToken
// 	            ValueType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.0#SAMLAssertionID"
// 	            EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">BASE64_SAML_TOKEN</wsse:BinarySecurityToken>
// 	      </wsse:Security>
//     </soapenv:Header>
//     <soapenv:Body>
//         <add:SearchProfessionalsRequest Id="bdc38ae62-3e7f-4f80-80f7-c3e745500fa3" IssueInstant="2016-03-23T18:49:26.968+01:00" Offset="0" MaxElements="100">
//             <add:SSIN>74062423769</add:SSIN>
//         </add:SearchProfessionalsRequest>
//     </soapenv:Body>
// </soapenv:Envelope>

xml := CkXml_Create();
CkXml_putTag(xml,'soapenv:Envelope');
CkXml_UpdateAttrAt(xml,'soapenv:Header|wsse:Security',True,'xmlns:wsse','http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd');
CkXml_UpdateAttrAt(xml,'soapenv:Header|wsse:Security|wsse:BinarySecurityToken',True,'ValueType','http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.0#SAMLAssertionID');
CkXml_UpdateAttrAt(xml,'soapenv:Header|wsse:Security|wsse:BinarySecurityToken',True,'EncodingType','http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary');

CkXml_UpdateChildContent(xml,'soapenv:Header|wsse:Security|wsse:BinarySecurityToken',base64_saml_token);

CkXml_UpdateAttrAt(xml,'soapenv:Body|add:SearchProfessionalsRequest',True,'Id','bdc38ae62-3e7f-4f80-80f7-c3e745500fa3');

dt := CkDateTime_Create();
CkDateTime_SetFromCurrentSystemTime(dt);
CkXml_UpdateAttrAt(xml,'soapenv:Body|add:SearchProfessionalsRequest',True,'IssueInstant',CkDateTime__getAsTimestamp(dt,True));

CkXml_UpdateAttrAt(xml,'soapenv:Body|add:SearchProfessionalsRequest',True,'Offset','0');
CkXml_UpdateAttrAt(xml,'soapenv:Body|add:SearchProfessionalsRequest',True,'MaxElements','100');
CkXml_UpdateChildContent(xml,'soapenv:Body|add:SearchProfessionalsRequest|urn:SSIN','74062423769');

Memo1.Lines.Add(CkXml__getXml(xml));

http := CkHttp_Create();

success := CkHttp_SetSslClientCert(http,cert);
if (success = False) then
  begin
    Memo1.Lines.Add(CkHttp__lastErrorText(http));
    Exit;
  end;

CkHttp_SetRequestHeader(http,'Content-Type','text/xml');
CkHttp_SetRequestHeader(http,'SOAPAction','urn:be:fgov:ehealth:addressbook:protocol:v1:searchProfessionals');

xmlStr := CkXml__getXml(xml);
resp := CkHttpResponse_Create();
success := CkHttp_HttpStr(http,'POST','https://services.ehealth.fgov.be/AddressBook/v1',xmlStr,'utf-8','application/xml',resp);
if (success = False) then
  begin
    Memo1.Lines.Add(CkHttp__lastErrorText(http));
    Exit;
  end;

Memo1.Lines.Add(CkHttpResponse__bodyStr(resp));
Memo1.Lines.Add('response status code = ' + IntToStr(CkHttpResponse_getStatusCode(resp)));

CkCert_Dispose(cert);
CkBinData_Dispose(bdSecToken);
CkXml_Dispose(xml);
CkDateTime_Dispose(dt);
CkHttp_Dispose(http);
CkHttpResponse_Dispose(resp);

end;