Es kommt immer mehr vor das mit Qlik Sense eine REST – API als Quelle genutzt wird. REST – API’s haben ein paar Eigenheiten, zum einen muss der genaue Pfad zum Endpoint bekannt sein, zum anderen können nicht alle Daten auf einmal geladen werden. Das sind einige der Probleme die man mit einer REST – API haben kann. Aber es kann auch schon nur ein Problem geben bis man die Verbindung hergestellt hat. Die Angaben von Qlik sind wie oft, mehr dürftig als wirklich ausführlich. Wenn in der Community gesucht wird, findet man alles, aber immer auf mehreren Seiten und nicht im Zusammenhängend. Damit das gelöst werden kann habe ich unten das wichtigste zusammengefasst.

 

Hier die wichtigsten Punkte

Verbindungen

Es muss pro Abfrage Art (Post, GET, etc.) eine Verbindung gemacht werden. Die URL (End – Point) kann später dynamisch eingefügt werden.

Authentifizierung

Viel wird ein Bearer Token verwendet für die Authentifizierung des Users. Da bei ist die Erste Abfrage da dafür da das Token zu beschlafen. Das Token ist nur für ein paar Tage gültig und muss dann erneuter werden. Da dieses Token auf der Schnittstelle («LIB») hinterlegt wird ist das nicht so gut.

Aber dafür gibt es auch eine Lösung. Auf der Verbindung (LIB) wird als URL der End-Point für das Lösen des Tokens eingegeben. Dieser Aufruf ist ein POST Request (Kann aber der API - Hersteller genau sagen). Wichtig ist das im Request body der User und das Passwort übergeben werden. Dort können noch weiter Parameter wie «grant_type=password oder so was stehen. Die genauen Parameter (Username, Passwort, etc. ) kann der Hersteller der API sagen.

Für das beschaffen des Token ist der Code unten. Dabei wird das Token in einer Variablen gespeichert. Es wird nicht geprüft ob das Token noch gültig ist, es wird jedes Mal ein neues Token geholt!

Code für die Beschaffung des Tokens

LIB CONNECT TO 'REST Verbindung POST';
RestConnectorMasterTable:
SQL SELECT
"access_token",
"token_type",
"expires_in",
"userName",
".issued",
".expires"
FROM JSON (wrap on) "root";

[root]:
LOAD [access_token],
[token_type],
[expires_in],
[userName],
[.issued],
[.expires]
RESIDENT RestConnectorMasterTable;

DROP TABLE RestConnectorMasterTable;

LET vL.AccessTokenValue=Peek('access_token');

Drop Table [root];

 

Daten abfragen

Dabei hilft euch Qlik Sense sehr gut, sobald die Connection läuft kann mit dem Wizard die Tabelle eingefügt werden, dabei wird das nötige Skript eingefügt.

 

Pageging der Daten

Beim Pageing geht es darum, dass die Daten nur in Schnitzen von 1000 oder 7000 Rows übertragen werden. Wenn ihr glück habt wurde die Schnittstelle nach dem Standard ODATA umgesetzt.

Wenn das so ist, super dann habe ich ein Beispiel für dich das recht gut ist. Ansonsten gibt es dir eventuell eine Idee wie es gelöst werden kann.

Lösung für ODATA

LIB CONNECT TO 'REST Verbindung GET';
Set vL.URL = ‘URL zum Endpoint…’;
Set vL.URL2 = ‘URL zum Endpoint, aus dem Tag nextLink….’;
Set vL.LenUrl = 1;
Set vL.NextUrl = '';
 
DO while vL.LenUrl > 0
RestConnectorMasterTable:
SQL SELECT
"@odata.context",
"@odata.nextLink",
"__KEY_root",
(SELECT
"DateId",
"Granularity",
"LocationId",
"LocationName",
"ParentId",
"TimeId",
"InCount",
"OutCount",
"__FK_value"
FROM "value" FK "__FK_value")
FROM JSON (wrap on) "root" PK "__KEY_root"
WITH CONNECTION (
URL "$(vl.urlCount)",
HTTPHEADER "Authorization" "Bearer $(vAccessTokenValue)"
);
 
[Result]:
LOAD * // Liste der Felder
RESIDENT RestConnectorMasterTable
WHERE NOT IsNull([__FK_value]);

[root]:
LOAD [@odata.context],
[@odata.nextLink],
[__KEY_root]
RESIDENT RestConnectorMasterTable
WHERE NOT IsNull([__KEY_root]);
 
LET vl.NextUrl= FieldValue(Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!',1);
drop Tables RestConnectorMasterTable, [root];
 
let vl.urlCount = vl.urlCount2;
Let vl.LenUrl = LEN('$(vl.NextUrl)');
 
//            Trace vURL: $(vl.urlCount);
//            Trace NextLink: $(vl.NextLink);
//            Trace Länge: $(vl.LenUrl);
Loop

Beim Beispiel oben ist es so dass die API via einen Proxy abgefragt wird. Daher ist die URL im «nextLink» nicht die korrekt URL. Deshalb gibt es zwei URL’s im code.

Der End - Point wird immer wieder neue gesetzt, die Daten werden dann Page für Page abgefragt und in einer Tabelle in Qlik Sense abgelegt. So ist es sehr einfach das ganz zu machen.

 

Wie wird das nun umgesetzt in Qlik Sense

  1. Verbindung aufbauen für POST
  2. Token lesen wie oben beschrieben, wichtig Token in der Variable speichern
  3. Token aus der Variable auslesen, wird verwendet beim Verbindungsaufbau für GET
  4. GET Verbindung aufbauen mit dem Token, als End -Point kann der erste End – Point erfasst werden der später abgefragt werden soll.
  5. So kann nun mit dem Wizard für Tabellen des Skripts das Skript sehr einfach erstellt werden.
    Erste Tabelle laden und schauen welche Daten kommen.

 

Fazit

Je Nach Schnittstelle kann das JSON anders aufgebaut sein, es kann sein, dass zwei oder mehr Tabellen angeliefert werden. Fast sicher ist das zwei Tabellen kommen, eine Tabelle ist die ROOT Tabelle. Diese Tabelle enthält alle Informationen die auf der ersten Ebene des JSON – Files sind. In den anderen Tabellen sind dann die Details dazu, die Verbindungen zu den Details sind mit FK und PK Feldern gegeben. Daher sind die Daten sehr gut nutzbar.

Nach dem ich diese Skripte erstellt hatte, habe ich Qlik Sense und REST – API gern ausgewertet. Ich hoffe es hilft euch auch etwas und wenn etwas nicht klar ist, fragt einfach nach. Ich helfe euch gern weiter.