Qlik REST Connector

Qlik har flera konnektorer och nyligen släpptes en REST-konnektor. Den kan användas för att hämta data från webtjänster så som Google Analytics, Facebook, Twitter och LinkedIn, och fungerar till både Qlik Sense och Qlikview. Hur man ansluter till dessa fyra tjänster finns också beskrivet som exempel i Qliks userguide, http://market.qlik.com/rest-connector.html. Men konnektorn fungerar för alla rest-apier som kan returnera data i XML, CSV, eller JSON format.

Picture1

Då jag jobbar både som BI- och CRM-utvecklare har jag fått i uppdrag att bygga en CRM-applikation, som kopplar upp sig mot CRM-systemet Sugar. Sugars API returnerar JSON som default men stöder också XML, jag väljer JSON eftersom datamängden blir minst då.

Skapa en ny koppling

Koppling

Det första vi ska göra är att skapa en ny koppling. Om konnektorn är installerad syns alternativet Qlik REST Connector i valmenyn. Du får då upp rutan ”Create new connection (REST)” där du kan skapa en ny koppling. Sugar använder Oauth för login, det krävs ett separat POST-anrop för själva inloggningen (Qliks konnektor stöder POST och GET-anrop). Vi skapar alltså först en koppling med ett POST-anrop. Detta anrop returnerar en nyckel, vilken vi behöver i resterande GET-anrop.

Välj data

Välj data

Konnektorn kommer att hjälper dig att skriva load scriptet. Klicka på välj data i konnektorn i panelen till höger. I rutan som kommer upp väljer du vilket data du vill läsa in, utifrån dina val skapas sedan ett script. Konnektorn känner själv av vilken datatyp det är, i detta fall JSON, vilket också kommer synas i det genererade scriptet där det står FROM JSON.

Select Data

LIB CONNECT TO 'Login';
RestConnectorMasterTable:
SQL SELECT
"access_token"
FROM JSON (wrap on) "root";
LET varToken = '"' & Peek('access_token', 0, 'RestConnectorMasterTable') &'"';
DROP TABLE RestConnectorMasterTable;

 

Nästa steg i detta exempel är att läsa in kontakterna från CRM-systemet. Vi skapar ytterligare en koppling men denna gång med ett GET-anrop. JSON-data som returneras kommer denna gång att innnehålla en hierarki. Till exempel kan en kontakt i Sugar ha flera e-postadresser. Så här ser e-postadresserna i JSON-datat ut.

"name":"Testkontakt","email":
[{"email_address":"testkontakt@gmail.com","invalid_email":false,"opt_out":false,"primary_address":true,"reply_to_address":false},
{"email_address":"gusta.lindstrom@egbs.se","invalid_email":false,"opt_out":false,"primary_address":false,"reply_to_address":false}]

Konnektorn hjälper dig att dela upp informationen i olika tabeller när den genererar scriptet. I detta exmpel blir det en underliggande tabell med epostadresser kopplade till tabellen med kontakter.

Picture2

Skräddarsy anropet

Vid laddningen av kontaktinformation kommer jag behöva dynamiska värden i anropen. Det går att ange URL, data-parametrar och headers i scriptet. På så sätt kan jag hantera Sugars inloggning, paginering samt göra laddningen inkrementell, först sköter vi inloggningen.

För att skriva över eller lägga till parametrar eller URL:n i anropet lägger man till WITH CONNECTION i anropet. Vi lägger till variabeln med loginnyckeln.

WITH CONNECTION(
HTTPHEADER "OAuth-Token" $(varToken)
);

Ladd inkrementellt

När man laddar data från en webbtjänst genom ett api är det extra viktigt att inte ladda onödigt data. Prestandan på laddningen är inte i närheten av t ex ODBC- koppling vilket kan göra att det tar lång tid att ladda mycket data. Belastning på miljön man laddar från kan också vara ett problem eller kostnad om man betalar för laddad volym. För att minimera mängden data som laddas laddar vi bara de poster som har modifieras sedan senaste laddningen. Vi styr detta på liknande sätt som inloggning, alltså med variabler i WITH CONNECTION. Se kod nedan, syntaxen för filtret är specifik för Sugar.

QUERY ”filter[0][date_modified][$gt]” $(vLastExecTime),

Paginera laddningen

På samma sätt kan man paginera laddningen, alltså dela upp laddningen i delar istället för att ladda allt på en gång. Qliks REST-konnektor har stöd för paginering men i detta fall, med kopplingen mot Sugar, sköter jag pagineringen själv genom att loopa tills api:et returnerar next offset lika med noll (också specifikt för Sugar).

do while v_next_offset >= 0
QUERY "max_num" "100",
QUERY "offset" $(v_next_offset),
let v_next_offset = peek('next_offset',0,'RestConnector_Contacts');

Lägger vi ihop allt blir det följande tillläg I anropet.

LIB CONNECT TO 'Contacts';
...

FROM JSON (wrap on) "root" PK "__KEY_root"
WITH CONNECTION(
URL "https://egbs.sugaropencloud.eu/rest/v10/Contacts",
QUERY "filter[0][date_modified][$gt]" $(vLastExecTime),
QUERY "max_num" "200",
QUERY "offset" $(v_next_offset),
HTTPHEADER "OAuth-Token" $(varToken));
let v_next_offset = peek('next_offset',0,'RestConnector_Contacts');

Share on LinkedInTweet about this on TwitterShare on Google+Share on FacebookEmail this to someone

Kommentera

E-postadressen publiceras inte. Obligatoriska fält är märkta *