HTTP berichten BoCount API

  • 2 minutes to read

Tables

CFL HttpMessage

procedure CFLCallBoCountApiUrl

procedure CFLCallBoCountApiUrl(ContentString: Text; ResultType: Enum "CFL Call Api ResultType"): Text

Roept de functie CFLCallApiUrl aan met de standaard parameters in combinatie met de HttpMessages API.

procedure CFLCallApiUrl

procedure CFLCallApiUrl(Url: Text; AADTenantID: Text; ClientID: Text; ClientSecret: Text; ContentString: Text; ResultType: Enum "CFL Call Api ResultType"): Text

Om de HttpMessage API te gebruiken is er typisch een http-request met POST methode nodig. Bv.

$Credential = Get-Credential
$Uri = 'https://customer.bocount.net:18003/Production/api/christiaens/bocountdynamics/v1.0'

#GET COMPANY
$Response = Invoke-RestMethod -Uri "$Uri/companies" -Credential $Credential -Method Get
$Company = $Response.value | Where-Object name -eq 'Adventure Bike'

#INSERT
$Hash = @{ ContentString = '{"Type":"API","Method":"HelloWorld","Params":"XYZ"}' }
Invoke-RestMethod -Uri "$Uri/companies($($Company.id))/HttpMessages" -Credential $Credential -Method Post -ContentType 'application/json' -Body ($hash | ConvertTo-Json)

Deze functie is een wrapper om deze request naar een http-request met GET methode te vertalen. Hierdoor kunnen we het resultaat van deze functie als eenvoudige (aanklikbare) hyperlink aanbieden (bv. in mailsjabloon), waarbij alle informatie wordt gebundeld in de querystring.

De informatie in deze querystring is een vaste JSON-structuur die we vertalen naar base64 en encrypteren via de AzureFunction 'httpmessages/toquerystring/v1.0'.

{ 
    "Url" : "https://customer.bocount.net:18003/Production/api/christiaens/bocountdynamics/v1.0/companies(9cd29464-3390-eb11-bb60-000d3a38e6db)/HttpMessages" ,
    "Username" : "SERVICE" , 
    "Password" : "******XG0pc8MvMHsK+2QqfR98QKSfNCqFxBFKrvZnk=" , 
    "ContentString" : "{\"Type\":\"API\",\"Method\":\"HelloWorld\",\"Params\":\"XYZ\"}",
    "ResultType": "String"
}

Of ananloog via App Registration (bv. in Saas).

{
    "AadTenantId": "9d73024c-******",
    "ClientId": "c3a2bc67-******",
    "ClientSecret": "PHg6O_******",
    "Scope": "api://c3a2bc67-*******/.default",
    "Url": "https://customer.bocount.net:18003/Production/api/christiaens/bocountdynamics/v1.0/companies(9cd29464-3390-eb11-bb60-000d3a38e6db)/HttpMessages",
    "ContentString": "{\"Type\":\"API\",\"Method\":\"HelloWorld\",\"Params\":\"XYZ\"}",
    "ResultType": "String"
}

Het resultaat van deze AzureFunction kunnen we nadien als apidata querystring-parameter gebruiken om de eigenlijke GET request uit te voeren via de AzureFunction 'httpmessages/callapi/v2.0'.

De querystring-parameter kan ook opgebouwd worden zonder ContentString (en ResultType). De body van de POST request via 'httpmessages/callapi/v2.0' wordt dan integraal als ContentString doorgestuurd naar BoCount Dynamics.

Hetgeen we effectief willen uitvoeren in BoCount Dynamics kunnen we via de gebruikelijke CFLOnCFLProcess-eventsubscriber verwerken.

[EventSubscriber(ObjectType::Table, Database::"CFL HttpMessage", 'CFLOnCFLProcess', '', true, true)]
local procedure HelloWorld(var Sender: Record "CFL HttpMessage")
var
    JsonObject: JsonObject;
begin
    if JsonObject.ReadFrom(Sender.CFLGetContent()) then begin
        if (JsonValue(JsonObject, 'Type') = 'API') and (JsonValue(JsonObject, 'Method') = 'HelloWorld') then begin
            Sender.CFLSetResponse(StrSubstNo('Hello %1 !', JsonValue(JsonObject, 'Params')));
            Sender.Modify(true);
            exit;
        end;
    end;
end;

local procedure JsonValue(JsonObject: JsonObject; "Key": Text): Text
var
    JsonToken: JsonToken;
begin
    if JsonObject.Get("Key", JsonToken) then
        exit(JsonToken.AsValue().AsText());
end;

Mogelijke ResultTypes bij het uitvoeren van de http-request zijn String, Html, Url of Pdf. Hou dus rekening dat de Response van de Http Message het juiste formaat is, corresponderend met het ResultType opgegeven in de JSON-structuur hierboven.

procedure ReturnHomePageAsUrl()
begin
    CompanyInformation.Get();
    Sender.CFLSetResponse(CompanyInformation."Home Page");
    Sender.Modify(true);
end;

procedure ReturnCustomerHistoryAsString(CustNo: Code[20])
begin
    //Report.RunRequestPage(report::"CFL Customer History") to generate ReportParams;
    ReportParams := StrSubstNo('<?xml version="1.0" standalone="yes"?><ReportParameters name="CFL Customer History" id="2098121"><DataItems><DataItem name="Customer">VERSION(1) SORTING(Field1) WHERE(Field1=1(%1))</DataItem></DataItems></ReportParameters>', CustNo);
    TempBlob.Blob.CreateOutStream(OutStr);
    Report.SaveAs(Report::"CFL Customer History", ReportParams, ReportFormat::Pdf, OutStr);
    Sender.CFLSetResponse(TempBlob.ToBase64String());
    Sender.Modify(true);
end;

procedure ReturnMailTemplateAsHtml(TemplateCode: Code[20])
begin
    MailTemplate.Get(TemplateCode);
    MailTemplate.CalcFields("CFL Template");
    MailTemplate."CFL Template".CreateInStream(InStr);
    InStr.Read(string);
    Sender.CFLSetResponse(string);
    Sender.Modify(true);
end;