Delphi DLL
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
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;