HTTP berichten BoCount API
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.
- Hiervoor wordt de Azure Applicatie info gebruikt volgens de BoCount Dynamics Systeeminstellingen.
- URL van HttpMessage API, bv. https://customer.bocount.net:18003/Production/api/christiaens/bocountdynamics/v1.0/companies(mycompanyname)/HttpMessages
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;