Sample code for 30+ languages & platforms
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

PureBasic
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