1
+ codeunit 50126 "API Web Service"
2
+ {
3
+ // Get a valid authentication token from setup. If token-age < expiry, get from blob, otherwise call API
4
+ procedure GetAuthenticationToken( ApiSetup: Record "EAPI Setup"; ForceRenewal: Boolean ) : Text
5
+ var
6
+ TokenResponseText: Text ;
7
+ TokenExpiry: DateTime ;
8
+ TokenOutStream: OutStream ;
9
+ TokenInStream: InStream ;
10
+ AuthPayload: Text ;
11
+ begin
12
+ if ( ApiSetup. "Token valid until" <= CurrentDateTime()) or ForceRenewal then begin
13
+ // Get fresh Token
14
+ TokenResponseText := GetFreshAuthenticationToken( ApiSetup, TokenExpiry) ;
15
+
16
+ // Write Token to Blob
17
+ ApiSetup. "API Token". CreateOutStream( TokenOutStream) ;
18
+ TokenOutStream. WriteText( TokenResponseText) ;
19
+
20
+ // Calculate the expriation date of the token.
21
+ // Should be defined by the API or even delivered in the response
22
+ if TokenExpiry <> 0DT then
23
+ ApiSetup. "Token valid until" := TokenExpiry;
24
+ ApiSetup. Modify () ;
25
+ end else begin
26
+ ApiSetup. CalcFields( "API Token") ;
27
+
28
+ // Read Token from Blob
29
+ ApiSetup. "API Token". CreateInStream( TokenInStream) ;
30
+ TokenInStream. ReadText( TokenResponseText) ;
31
+ end ;
32
+
33
+ // Return the token
34
+ exit ( TokenResponseText) ;
35
+ end ;
36
+
37
+ procedure GetFreshAuthenticationToken( ApiSetup: Record "EAPI Setup"; var TokenExpiry: DateTime ) : Text
38
+ var
39
+ AuthPayload: Text ;
40
+ ResponseText: Text ;
41
+ TokenResponseText: Text ;
42
+ JObjectResult: JsonObject ;
43
+ JObjectRequest: JsonObject ;
44
+ WebClient: HttpClient ;
45
+ RequestHeader: HttpHeaders ;
46
+ ResponseMessage: HttpResponseMessage ;
47
+ RequestMessage: HttpRequestMessage ;
48
+ RequestContent: HttpContent ;
49
+ TokenOutStream: OutStream ;
50
+ begin
51
+ // Create webservice call
52
+ RequestMessage. Method := ' POST' ;
53
+ RequestMessage. SetRequestUri( ApiSetup. Audiance) ;
54
+
55
+ // Create webservice header
56
+ RequestMessage. GetHeaders( RequestHeader) ;
57
+
58
+ // Payload needed? This might as well be a different implementation!
59
+ // It's just an example where the credentials are stored as a json payload
60
+
61
+ // Create json payload
62
+ JObjectRequest. Add ( ' client_id' , ApiSetup. "Client Id") ;
63
+ JObjectRequest. Add ( ' client_secret' , ApiSetup. "Client Secret") ;
64
+ JObjectRequest. WriteTo( AuthPayload) ;
65
+
66
+ // Get Request Content
67
+ RequestContent. WriteFrom( AuthPayload) ;
68
+
69
+ RequestContent. GetHeaders( RequestHeader) ;
70
+ RequestHeader. Remove( ' Content-Type' ) ;
71
+ RequestHeader. Add ( ' Content-Type' , ' application/json' ) ;
72
+
73
+ RequestMessage. Content := RequestContent;
74
+
75
+ // Send webservice query
76
+ WebClient. Send( RequestMessage, ResponseMessage) ;
77
+
78
+ if ResponseMessage. IsSuccessStatusCode() then begin
79
+ ResponseMessage. Content(). ReadAs( ResponseText) ;
80
+
81
+ if not JObjectResult. ReadFrom( ResponseText) then
82
+ Error( ' Error Read JSON' ) ;
83
+
84
+ TokenResponseText := GetJsonToken( JObjectResult, ' access_token' ). AsValue(). AsText() ;
85
+ TokenExpiry := GetJsonToken( JObjectResult, ' expiry_date' ). AsValue(). AsDateTime() ;
86
+
87
+ end else
88
+ Error( ' Webservice Error' ) ;
89
+
90
+ exit ( TokenResponseText) ;
91
+ end ;
92
+
93
+ local procedure GetJsonToken( JsonObject : JsonObject ; TokenKey: Text ) JsonToken : JsonToken ;
94
+ begin
95
+ if not JsonObject . Get( TokenKey, JsonToken ) then
96
+ Error( StrSubstNo( ' Token %1 not found' , TokenKey)) ;
97
+ end ;
98
+ }
0 commit comments