PureBasic
PureBasic
Belgium eHealth Platform - AddressBook - Search for Professionals
See more Belgian eHealth Platform Examples
Demonstrates how to search for professionals using the AddressBook API.Chilkat PureBasic Downloads
IncludeFile "CkBinData.pb"
IncludeFile "CkDateTime.pb"
IncludeFile "CkHttp.pb"
IncludeFile "CkXml.pb"
IncludeFile "CkHttpResponse.pb"
IncludeFile "CkCert.pb"
Procedure ChilkatExample()
success.i = 0
; 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.i = CkCert::ckCreate()
If cert.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkCert::ckLoadPfxFile(cert,"SSIN=12345678.acc.p12","p12_password")
If success = 0
Debug CkCert::ckLastErrorText(cert)
CkCert::ckDispose(cert)
ProcedureReturn
EndIf
; 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.i = CkBinData::ckCreate()
If bdSecToken.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkBinData::ckLoadFile(bdSecToken,"qa_data/tokens/ehealth-fgov-be-sectoken.xml")
If success = 0
Debug "Failed to load SAML security token"
CkCert::ckDispose(cert)
CkBinData::ckDispose(bdSecToken)
ProcedureReturn
EndIf
; The SAML security token is just the part from <Assertion ..> ... </Assertion>
; So let's get just that part..
startIdx.i = CkBinData::ckFindString(bdSecToken,"<Assertion",0,"utf-8")
If startIdx < 0
Debug "Did not find the start of the SAML assertion."
CkCert::ckDispose(cert)
CkBinData::ckDispose(bdSecToken)
ProcedureReturn
EndIf
endIdx.i = CkBinData::ckFindString(bdSecToken,"</Assertion>",0,"utf-8")
If endIdx < 0
Debug "Did not find the end of the SAML assertion."
CkCert::ckDispose(cert)
CkBinData::ckDispose(bdSecToken)
ProcedureReturn
EndIf
; Adjust the index to the 1st byte after "</Assertion>"
endIdx = endIdx + 12
base64_saml_token.s = CkBinData::ckGetEncodedChunk(bdSecToken,startIdx,endIdx - startIdx,"base64")
Debug 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.i = CkXml::ckCreate()
If xml.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkXml::setCkTag(xml, "soapenv:Envelope")
CkXml::ckUpdateAttrAt(xml,"soapenv:Header|wsse:Security",1,"xmlns:wsse","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")
CkXml::ckUpdateAttrAt(xml,"soapenv:Header|wsse:Security|wsse:BinarySecurityToken",1,"ValueType","http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.0#SAMLAssertionID")
CkXml::ckUpdateAttrAt(xml,"soapenv:Header|wsse:Security|wsse:BinarySecurityToken",1,"EncodingType","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary")
CkXml::ckUpdateChildContent(xml,"soapenv:Header|wsse:Security|wsse:BinarySecurityToken",base64_saml_token)
CkXml::ckUpdateAttrAt(xml,"soapenv:Body|add:SearchProfessionalsRequest",1,"Id","bdc38ae62-3e7f-4f80-80f7-c3e745500fa3")
dt.i = CkDateTime::ckCreate()
If dt.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
CkDateTime::ckSetFromCurrentSystemTime(dt)
CkXml::ckUpdateAttrAt(xml,"soapenv:Body|add:SearchProfessionalsRequest",1,"IssueInstant",CkDateTime::ckGetAsTimestamp(dt,1))
CkXml::ckUpdateAttrAt(xml,"soapenv:Body|add:SearchProfessionalsRequest",1,"Offset","0")
CkXml::ckUpdateAttrAt(xml,"soapenv:Body|add:SearchProfessionalsRequest",1,"MaxElements","100")
CkXml::ckUpdateChildContent(xml,"soapenv:Body|add:SearchProfessionalsRequest|urn:SSIN","74062423769")
Debug CkXml::ckGetXml(xml)
http.i = CkHttp::ckCreate()
If http.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkHttp::ckSetSslClientCert(http,cert)
If success = 0
Debug CkHttp::ckLastErrorText(http)
CkCert::ckDispose(cert)
CkBinData::ckDispose(bdSecToken)
CkXml::ckDispose(xml)
CkDateTime::ckDispose(dt)
CkHttp::ckDispose(http)
ProcedureReturn
EndIf
CkHttp::ckSetRequestHeader(http,"Content-Type","text/xml")
CkHttp::ckSetRequestHeader(http,"SOAPAction","urn:be:fgov:ehealth:addressbook:protocol:v1:searchProfessionals")
xmlStr.s = CkXml::ckGetXml(xml)
resp.i = CkHttpResponse::ckCreate()
If resp.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkHttp::ckHttpStr(http,"POST","https://services.ehealth.fgov.be/AddressBook/v1",xmlStr,"utf-8","application/xml",resp)
If success = 0
Debug CkHttp::ckLastErrorText(http)
CkCert::ckDispose(cert)
CkBinData::ckDispose(bdSecToken)
CkXml::ckDispose(xml)
CkDateTime::ckDispose(dt)
CkHttp::ckDispose(http)
CkHttpResponse::ckDispose(resp)
ProcedureReturn
EndIf
Debug CkHttpResponse::ckBodyStr(resp)
Debug "response status code = " + Str(CkHttpResponse::ckStatusCode(resp))
CkCert::ckDispose(cert)
CkBinData::ckDispose(bdSecToken)
CkXml::ckDispose(xml)
CkDateTime::ckDispose(dt)
CkHttp::ckDispose(http)
CkHttpResponse::ckDispose(resp)
ProcedureReturn
EndProcedure