Содержание урока по Qlik Sense
Введение в Qlik Sense API. Руководство для разработчика
Engine JSON API
Qlik Engine JSON API представляет собой протокол WebSocket, который использует JSON для передачи информации между Qlik Sense Engine и клиентами. Qlik Engine JSON API состоит из набора объектов , представляющих приложения, списки и так далее. Эти объекты организованы в иерархическую структуру. Когда вы отправляете запросы в API, вы выполняете действия над этими объектами.
Qlik Engine JSON API может быть использован для:
- создания приложений и загрузки данных
- создания историй (data stories)
- получение системной информации
Типичные ситуации, в которых вы бы использовали JSON API Qlik Engine:
- создание специализированного клиента в качестве
- автономного или веб-приложения
- автоматизация повторяющихся или сложных
- обновлений или изменений в приложениях
Extension API
API расширения (Extension API) состоит из методов и свойств, используемых для создания пользовательских расширений визуализации (custom visualization extensions).
Backend API
Backend API состоит из нескольких методов и используется для связи с ассоциативным механизмом Qlik. Он предоставляет вспомогательные функции для вызовов ассоциативного механизма Qlik и доступ к данным ассоциативного механизма Qlik. Вкратце, Backend API – это оболочка для выбранных методов Qlik Engine JSON API, но с той разницей, что Backend API знает о контексте, то есть текущем соединении WebSocket и приложении Qlik Sense.
Capability APIs
API-интерфейсы Capability представляют собой набор API-интерфейсов JavaScript, которые позволяют легко встраивать контент Qlik Sense в веб-страницу. С помощью всего лишь нескольких строк кода можно создать визуализацию, использующую библиотеку визуализации Qlik Sense.
API-интерфейсы Capability зависят от AngularJS и RequireJS, поэтому вам необходимо принять это во внимание при интеграции API-возможностей Capability в существующий проект, в котором также используются эти библиотеки.
Термин «API-интерфейс Capability» был введен в Qlik Sense 2.1. Некоторые из API-интерфейсов Capability были доступны до этой версии, опубликованной под названием Mashup API.
Capability API | Namespace |
Root API | qlik |
App API | qlik.app |
Bookmark API | qlik.app.bookmark |
Field API | qlik.app.field |
Selection API | qlik.app.selectionState |
Variable API | qlik.app.variable |
Visualization API | qlik.app.visualization |
Global API | qlik.global |
Navigation API | qlik.navigation |
Table API | qlik.table |
Theme API | qlik.theme |
Root API
Root API является внешним интерфейсом Qlik Sense и доступен в виде пространства имен qlik. Он предоставляет методы открытия приложений, получения ссылки на текущее приложение, установки определенного языка и регистрации обратных вызовов для обработки ошибок. Корневой API также содержит методы для перечисления доступных приложений и расширений, а также для регистрации расширений (extensions), которые вы создаете на лету (используя API визуализации – Visualization API).
App API
Метод qlik.openApp является точкой входа в API приложения и возвращает объекты JavaScript приложения с методами для работы с приложением Qlik Sense, к которому вы подключены.
Bookmark API
Bookmark API содержит методы для работы с закладками в приложении Qlik Sense, к которому вы подключены.
Field API
Метод qlik.app.field является точкой входа в Field API. Он возвращает объект QField с методами и свойствами, которые можно использовать для управления полем.
Global API
Метод qlik.global является точкой входа в Global API. Возвращает объект JavaScript с глобальными методами.
Navigation API
Navigation API (API навигации) позволяет вам перемещаться в приложении Qlik Sense и предназначен для использования в виджетах и расширениях визуализации, и не будет работать в сценариях Mashup.
Selection API
Selection API является внешним интерфейсом для изменения выборки по модели данных Qlik Sense (фильтрация данных) и позволяет разработчикам работать с ассоциативной моделью.
Table API
Table API (API таблиц) позволяет разработчикам работать с табличными данными, возвращаемыми из ассоциативного механизма Qlik, не имея глубоких знаний о внутренних конструкциях, таких как, например, Гиперкуб (Hypercube).
Theme API
Theme API – это внешний интерфейс для тем Qlik Sense. Он позволяет настраивать визуализации, включая расширения и виджеты, вне Qlik Sense.
Variable API
Variable API – это внешний интерфейс для управления переменными Qlik Sense.
Visualization API
Visualization API (API визуализации) – это внешний интерфейс для визуализаций Qlik Sense. Вы можете создавать новые визуализации на лету на основе объекта сессии. Эти визуализации не сохраняются в приложении. Вы также можете получить уже существующие визуализации из приложения, используя Visualization API.
Custom Component API
API для создания пользовательских компонентов (собственных компонентов).
Пользовательские компоненты содержат следующие элементы:
- Файл определения (QEXT).
- Основной файл JavaScript.
- Дополнительные ресурсы, такие как библиотеки JavaScript, изображения и шрифты.
Пользовательские компоненты – это в основном директивы AngularJS. Цель файла JavaScript – вернуть подпись директивы AngularJS.
App Integration API
Используется для embedded аналитика, позволяет генерировать ссылки url для встраивания в iframe.
Single Integration API
Single Integration API позволяет создавать URL-адреса, который возвращает полную HTML-страницу, содержащую, например, встроенную визуализацию Qlik Sense . Этот URL-адрес можно встроить в веб-страницу, например, включив его в iframe.
qlik-visual web component
Qlik-Visual Web Component – это определение пользовательского элемента <qlik-visual>, которое использует API визуализации и представляет его как веб-компонент. Он позволяет создавать и изменять визуализации на лету, не используя клиент Qlik Sense.
Qlik Visual поддерживает:
- Отображение существующей визуализации (путем определения видимости элемента) на веб-странице.
- Создание визуализаций на лету с использованием существующего приложения путем внедрения их в веб-страницу.
- Динамически изменяющие свойства и атрибуты визуализаций.
enigma.js
Библиотека enigma.js помогает вам общаться с ассоциативным механизмом Qlik в Qlik Sense и Qlik Sense Desktop. Вы можете использовать его для создания своего собственного клиента или для создания собственного сервиса Node.js. Примерами использования могут быть создание ваших собственных аналитических инструментов на основе браузера, серверных служб или сценариев командной строки.
Библиотека enigma.js может использоваться в качестве SDK или для выполнения операций CRUD (то есть создания, чтения, обновления и удаления) в приложениях и в сущностях приложений.
enigma.js – это библиотека, предназначенная исключительно для Engine API (websocket). Экспорт изображений / PDF-файлов – это API-интерфейсы REST в Qlik Sense для других служб (отчеты), которые предоставляются через интерфейс capability API:
- https://help.qlik.com/en-US/sense-developer/September2019/Subsystems/APIs/Content/Sense_ClientAPIs/CapabilityAPIs/VisualizationAPI/exportImg-method.htm
- https://help.qlik.com/en-US/sense-developer/September2019/Subsystems/APIs/Content/Sense_ClientAPIs/CapabilityAPIs/VisualizationAPI/exportPdf-method.htm
Официальная документация Enigma.JS: https://github.com/qlik-oss/enigma.js
enigma-go
Библиотека enigma-go помогает вам общаться с ассоциативным механизмом Qlik в Qlik Sense и Qlik Sense Desktop. Примерами использования могут быть создание ваших собственных аналитических инструментов, серверных служб или других инструментов, взаимодействующих с ассоциативным механизмом Qlik. Библиотека enigma-go может использоваться в качестве SDK или для выполнения операций CRUD (то есть создания, чтения, обновления и удаления) в приложениях и в сущностях приложений.
leonardo-ui
leonardo-ui – это библиотека с открытым исходным кодом, которая используется в Qlik Sense и предоставляет множество графических компонентов пользовательского интерфейса. Разметка этих компонентов может использоваться в расширениях, гибридных приложениях и виджетах. Библиотека поддерживается и поддерживается Qlik. leonardo-ui можно использовать как с Qlik Sense, так и с Qlik Sense Desktop.
picasso.js
Библиотека диаграмм picasso.js оптимизирована для создания пользовательских, интерактивных и мощных визуализаций для платформы Qlik Sense Analytics.
nebula.js
nebula.js – это библиотека с открытым исходным кодом, разработанная на GitHub. nebula.js – это набор библиотек и API-интерфейсов JavaScript, не зависящих от продукта и инфраструктуры, который помогает разработчикам интегрировать визуализации и гибридные приложения поверх ассоциативного механизма Qlik в Qlik Sense Desktop , Qlik Sense Enterprise для Windows и SaaS-версиях Qlik Sense . Он предлагает разработчикам альтернативу capability APIs, которые исторически использовались для создания гибридных приложений.
Чтобы использовать nebula.js , вы должны быть знакомы с JavaScript, promises, websockets и библиотеками с открытым исходным кодом. Вам понадобится Node.js и доступ к ассоциативному движку Qlik . Также будет полезно знание таких концепций Qlik, как generic objects и гиперкубы.
Qlik Explorer для разработчиков
Qlik Explorer для разработчиков – это инструмент, созданный для упрощения процесса интеграции функциональности Qlik Sense в другие среды.
Qlik Explorer для разработчиков обеспечивает быстрый доступ к соответствующей информации из вашей среды Qlik Sense, что, например, позволяет легко интегрировать визуализации Qlik Sense в существующий веб-сайт.
Автоматическое обновление
Qlik Explorer для разработчиков автоматически обновляется при появлении новой версии.
Как подключить Qlik Explorer к Qlik Sense Desktop Hub
В настройках вбиваете http://localhost:4848/
После подключения отобразится список приложений со свойствами и методами. Profit 😉
Engine API Explorer в браузере
http://localhost:4848/dev-hub/engine-api-explorer
Подключение к API Qlik Engine
todo
Подключение к Qlik Sense API с помощью PowerShell
https://community.qlik.com/t5/Qlik-Sense-Integration/How-to-export-an-app-to-a-folder-using-API-and-Powershell/td-p/1608192
Qlik Sense python API client for QPS and QRS interfaces
https://developer.qlik.com/garden/570e73c36c8c33c066a0f11c
Пример подключения Python 3 к Qlik Sense Engine API
Для подключения и работы необходимо установить библиотеки:
pip3 install asyncio pip3 install websocket-client pip3 install requests_ntlm pip3 install requests pip3 install json
Дальше приведен скрипт подключения Python 3 к Qlik Sense Desktop:
from websocket import create_connection import json ws = create_connection("ws://localhost:4848/app/") data=json.dumps({ 'jsonrpc': '2.0', 'id': 2, 'method': 'GetActiveDoc', 'handle': 1, 'params': ['C:\\Users\\User\\Documents\\Qlik\\Sense\\Apps\\Анализ продаж - простое приложение.qvf'] }) print("Sending req...") ws.send(data) print("Receiving...") result = ws.recv() print("Received '%s'" % result) qclosed = ws.close() print("Closed '%s'" % qclosed)
Результат работы скрипта:
>>> RESTART: D:/QlikProject/Подключаемся к Qlik Sense из Python.py Sending req... Receiving... Received '{"jsonrpc":"2.0","method":"OnConnected","params":{"qSessionState":"SESSION_CREATED"}}' Closed 'None'
Пример скрипта Python 3 для получения списка документов с hub Qlik Sense Desktop
from websocket import create_connection import json ws = create_connection("ws://localhost:4848/app/") ws.send(json.dumps({ "handle": -1, "method": "GetDocList", "params": [], "outKey": -1, "id": 1 })) result = ws.recv() while result: result=ws.recv() y = json.loads(result) print(y) ws.close()
Список классов, свойств и методов https://betahelp.qlik.com/en-US/sense-developer/June2019/apis/EngineAPI/index.html
Подключаемся к Qlik Sense Engine API с помощью Node.JS
Рассматривается пример подключения к Qlik Sense Desktop
const WebSocket = require('ws'); const ws = new WebSocket('ws://localhost:4848/app/engineData'); var request = { "handle": -1, "method": "GetDocList", "params": {}, "outKey": -1, "id": 2 } ws.onopen = function(event){ ws.send(JSON.stringify(request)); ws.onmessage = function (event) { var response = JSON.parse(event.data); if(response.method != ' OnConnected'){ var obj = response.result; str = JSON.stringify(obj, null, 4); console.log(str); } } }
Получаем перечень приложений Qlik Sense Desktop с помощью Enigma JS
const enigma = require('enigma.js'); const WebSocket = require('ws'); const schema = require('enigma.js/schemas/12.20.0.json'); // create a new session: const session = enigma.create({ schema, url: 'ws://localhost:4848/app/engineData', createSocket: url => new WebSocket(url), }); // bind traffic events to log what is sent and received on the socket: session.on('traffic:sent', data => console.log('sent:', data)); session.on('traffic:received', data => console.log('received:', data)); // open the socket and eventually receive the QIX global API, and then close // the session: session.open() .then(function(global) { global.getDocList().then(function(docList) { for (i = 0; i < docList.length; i++) { var AppName = docList[i].qDocName; console.log('App list:',JSON.stringify(AppName)); } session.close(); }) });
Получаем свойства документа Qlik Sense с помощью запроса Enigma.JS через QS API Engine
const enigma = require('enigma.js'); const WebSocket = require('ws'); const schema = require('enigma.js/schemas/12.20.0.json'); // create a new session: const session = enigma.create({ schema, url: 'ws://localhost:4848/app/engineData', createSocket: url => new WebSocket(url), }); // bind traffic events to log what is sent and received on the socket: session.on('traffic:sent', data => console.log('sent:', data)); session.on('traffic:received', data => console.log('received:', data)); // open the socket and eventually receive the QIX global API, and then close // the session: session.open() .then(function(global) { global.getDocList().then(docs=>{ global.openDoc("Анализ продаж - простое приложение.qvf").then(doc=>{ doc.getAppProperties().then(appProp => { console.log(doc) console.log(appProp) }) }) }) })
Пример получения списка полей в Qlik Sense API Engine, с помощью Enigma.JS
Пример актуален для Qlik Sense Desktop
const enigma = require('enigma.js'); const WebSocket = require('ws'); const schema = require('enigma.js/schemas/12.20.0.json'); // Создаем новую сессию: const session = enigma.create({ schema, url: 'ws://localhost:4848/app/engineData', createSocket: url => new WebSocket(url), }); // Привязываем traffic events к log (что отправлено и что получено socket) session.on('traffic:sent', data => console.log('sent:', data)); session.on('traffic:received', data => console.log('received:', data)); var config = { schema: schema, docId: "Анализ продаж - простое приложение.qvf" } // Открываем сессию session.open() .then(function(global) { global.openDoc(config.docId).then(function(doc){ //Создаем SessionObject для FieldList doc.createSessionObject( { qFieldListDef: { qShowSystem: false, qShowHidden: false, qShowSrcTables: true, qShowSemantic: true, qShowDerivedFields: true }, qInfo: { qId: "FieldList", qType: "FieldList" } } ).then( function(list) { return list.getLayout(); } ).then( function(listLayout) { return listLayout.qFieldList.qItems; } ).then( function(fieldItems) { console.log(fieldItems) } ); }) });
Пример javascript скрипта выгрузки / экспорта данных из QS, используя Enigma.JS
В результате выполнения JS-скрипта Вы получите qURL:
qUrl:”/Exports/1b2f8662-570b-4f77-b37b-94a4a347fe91\FileName(6bb5e11a-427a-4e77-ac30-e49abf602c87).xlsx”
Код запроса exportData Enigma.JS Qlik Sense Table API:
const enigma = require('enigma.js'); const WebSocket = require('ws'); const schema = require('enigma.js/schemas/12.20.0.json'); // Создаем новую сессию: const session = enigma.create({ schema, url: 'ws://localhost:4848/app/engineData', createSocket: url => new WebSocket(url), }); // Привязываем traffic events к log (что отправлено и что получено socket) session.on('traffic:sent', data => console.log('sent:', data)); session.on('traffic:received', data => console.log('received:', data)); var config = { schema: schema, docId: "Анализ продаж - простое приложение.qvf" } var exportOptions = { "qFileType": "OOXML", "qPath": "/qHyperCubeDef", "qFileName": "FileName", "qExportState": 1 } // Открываем сессию session.open() .then((global) => { console.log('We are connected!') global.openDoc(config.docId) .then(doc => { doc.getObject('XPbGUe') .then((api) => { api.exportData(exportOptions) .then((reply) => { console.log(reply); }); }); }); });
Пример javascript скрипта выгрузки / экспорта данных из Qlik Sense Enterprise, используя Enigma.JS
Данные выгружаем из прямой таблицы, в поле TargetFieldSelect выбираем значение NeededValueToSelect.
const enigma = require('enigma.js'); const WebSocket = require('ws'); const path = require('path'); const fs = require('fs'); const fetch = require('node-fetch'); const schema = require('enigma.js/schemas/12.20.0.json'); const { Console } = require('console'); // Your Sense Enterprise installation hostname: const engineHost = 'qlik.company.com'; // Make sure the port below is accessible from the machine where this example // is executed. If you changed the QIX Engine port in your installation, change this: const enginePort = 4747; // 'engineData' is a special "app id" that indicates you only want to use the global // QIX interface or session apps, change this to an existing app guid if you intend // to open that app: const appId = 'engineData'; // The Sense Enterprise-configured user directory for the user you want to identify // as: const userDirectory = 'QLIKDEV'; // The user to use when creating the session: const userId = 'username'; // Path to a local folder containing the Sense Enterprise exported certificates: const certificatesPath = './'; // Helper function to read the contents of the certificate files: const readCert = (filename) => fs.readFileSync(path.resolve(__dirname, certificatesPath, filename)); const session = enigma.create({ schema, url: `wss://${engineHost}:${enginePort}/app/${appId}`, // Notice the non-standard second parameter here, this is how you pass in // additional configuration to the 'ws' npm library, if you use a different // library you may configure this differently: createSocket: (url) => new WebSocket(url, { ca: [readCert('root.pem')], key: readCert('client_key.pem'), cert: readCert('client.pem'), headers: { 'X-Qlik-User': `UserDirectory=${encodeURIComponent(userDirectory)}; UserId=${encodeURIComponent(userId)}`, }, }), }); // Открываем сессию session.open() .then((global) => { global.openDoc('03h5ed8-5gdfb-40a5-b733-41fc4beb718e') .then(doc => { doc.getField("TargetFieldSelect") .then((appField) => { appField.select('NeededValueToSelect',false,0) .then((selectResult) => { console.log(selectResult); doc.getObject('jwAJbyL') .then((objectTable) => { objectTable.getHyperCubeData("/qHyperCubeDef", [{ qTop: 0, qWidth: 10, qLeft: 0, qHeight: 1000 }]) .then(function (data) { let dataSTR = JSON.stringify(data[0].qMatrix); fs.writeFileSync('DataOutput.json', dataSTR); session.close(); }) }) }) }) }) });
_____
Описание архитектуры Qlik Engine API
Структура объектов
Схемка сделана “на глаз”, но вероятно так и работает.
API Component Overview
MindMap API Integration
Схема по-умолчанию для процесса authenticate (default flowchart)
YouTube Enigma.JS Qlik Sense API Development
Youtube Другие видео по Qlik Sense API
Полезные ссылки по Enigma.JS и Qlik Sense API
- https://dev.to/qlikbranch/getting-started-with-qlik-core-2781 – Getting Started with Qlik Core
- https://branch-blog.qlik.com/system-integration-with-qliks-apis-why-and-how-1663025cf54d – System Integration with Qlik’s APIs — Why and How
- https://alcmst.net/2019/03/01/quiz-sense-who-wants-to-be-a-qlikionnaire/ – Quiz Sense – Who wants to be a Qlikionnaire?
_____