5 способов подключиться к Qlik Engine
В гибридных приложениях или веб-приложениях Qlik Engine находится за пределами вашего проекта, он недоступен и не загружается по умолчанию. Итак, прежде чем делать что-либо дальше, ваш первый шаг – создать соединение с Qlik Engine, после чего вы можете продолжить открывать сессию и выполнять действия в этом приложении, например:
- Открыть документ/приложение
- Делать выборки
- Получать визуализации
Для использования Qlik Engine API откройте WebSocket в движке. В зависимости от того, с какой программой вы работаете, с Qlik Sense Enterprise или Qlik Sense Desktop, способ реализации может отличаться. В этой статье мы подробно расскажем, как можно подключиться к движку Qlik, и о преимуществах такого решения.
Создаем соединение
Чтобы создать соединение с помощью WebSockets, вам сначала необходимо установить новую линию связи через веб-сокет. Чтобы открыть WebSocket в движке, воспользуйтесь одним из следующих URI:
Qlik Sense Enterprise |
Qlik Sense Desktop |
wss://server.domain.com:4747/app/ или wss://server.domain.com[/virtual proxy]/app/ |
ws://localhost:4848/app |
Создание соединения с использованием WebSockets
В случае Qlik Sense Desktop, все, что вам нужно сделать, это определить переменную WebSocket, включая ее строку подключения, следующим образом:
var ws = new WebSocket("ws://localhost:4848/app/");
После открытия соединения и проверки наличия ws.open() вы можете вызвать дополнительные методы для движка с помощью ws.send().
В этом примере я получаю доступные документы в своей среде Qlik Sense Desktop и добавляю их в список HTML:
<html> <body> <ul id='docList'> </ul> </body> </html> <script> var ws = new WebSocket("ws://localhost:4848/app/"); 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 docList = response.result.qDocList; var list = ''; docList.forEach(function(doc){ list += '<li>'+doc.qDocName+'</li>'; }) document.getElementById('docList').innerHTML = list; } } } </script>
В предыдущем примере, если Qlik Sense Desktop работает в фоновом режиме в вашем браузере будет отображен следующий результат:
Все методы и вызовы движка можно протестировать удобным для пользователя способом, изучив Qlik Engine в Dev Hub.
Одно соединение WebSocket может быть связано только с одним сеансом движка (состоит из контекста приложения и пользователя). Если вам необходимо работать с несколькими приложениями, вы должны открыть отдельный WebSocket для каждого из них.
Если вы хотите создать WebSocket соединение непосредственно с приложением, вы можете расширить URL-адрес конфигурации, включив в него имя приложения или, в случае Qlik Sense Enterprise, GUID. Затем вы можете использовать метод из класса приложения и любых других классов, продолжая работать с объектами в приложении.
var ws = new WebSocket("ws://localhost:4848/app/MasteringQlikSense.qvf");
Создаем подключение к Qlik Server Engine
Подключение к движку в среде Qlik Sense немного отличается, так как сначала вам нужно будет позаботиться об аутентификации. Аутентификация выполняется по-разному, в зависимости от того, как вы настроили конфигурацию сервера, вот самые распространенные способы:
- Тикеты
- Сертификаты
- Аутентификация заголовка
Аутентификация также зависит от того, где выполняется код, взаимодействующий с Qlik Engine.
Если ваш код работает на доверенном компьютере, аутентификация может выполняться несколькими способами, в зависимости от того, как настроена ваша установка и где выполняется код:
- Если вы запускаете код с надежного компьютера, вы можете использовать сертификаты, которые сначала необходимо экспортировать через QMC.
- Если код работает в веб-браузере или сертификаты недоступны, вы должны пройти аутентификацию через виртуальный прокси на сервере
Создание подключения с использованием сертификатов
Сертификаты можно рассматривать как знак доверия, они позволяют напрямую связываться с Qlik Engine, получив полный набором разрешений. При таком подходе, только серверные решения имеют доступ к сертификатам, и вы должны внимательно следить за их распространением. Чтобы подключиться с помощью сертификатов, вам сначала нужно экспортировать их через QMC, но сделать это будет относительно легко:
После экспорта вам необходимо скопировать их в папку, в которой находится ваш проект, используйте следующий код:
<html> <body> <h1>Mastering QS</h1> </body> <script> var certPath = path.join('C:', 'ProgramData', 'Qlik', 'Sense', 'Repository', 'Exported Certificates', '.Local Certificates'); var certificates = { cert: fs.readFileSync(path.resolve(certPath, 'client.pem')), key: fs.readFileSync(path.resolve(certPath, 'client_key.pem')), root: fs.readFileSync(path.resolve(certPath, 'root.pem')) }; //Открыть WebSocket, используя порт движка (а не через прокси) var ws = new WebSocket('wss://server.domain.com:4747/app/', { ca: certificates.root, cert: certificates.cert, key: certificates.key, headers: { 'X-Qlik-User': 'UserDirectory=internal; UserId=sa_engine' } }); ws.onopen = function (event) { //Вызов ваших методов } </script>
Создание подключения с помощью Mashup API
Хотя подключение к движку – это первый и фундаментальный шаг для начала взаимодействия с Qlik, подключение через WebSockets очень низкоуровневое. Для сложных случаев использования Mashup API – это один из способов ускорить освоение более удобного для разработчиков уровня абстракции.
Mashup API использует интерфейс Qlik как внешний интерфейс для Qlik Sense, используемый для гибридных приложений и для включения объектов Qlik Sense во внешние веб-страницы.
Чтобы загрузить модуль qlik, вам сначала нужно убедиться, что RequireJS доступен в вашем основном файле проекта. Затем вам нужно будет указать URL-адрес вашей среды Qlik Sense, а также префикс виртуального прокси, если он есть:
<html> <body> <h1>Mastering QS</h1> </body> </html> <script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.5/require.min.js"> <script> //Когда виртуальный прокси используется с браузером, применяется префикс. var prefix = window.location.pathname.substr( 0, window.location.pathname.toLowerCase().lastIndexOf( "/extensions" ) + 1 );
//Конфигурация для получения модуля qlik.js с сервера Qlik Sense var config = { host: window.location.hostname, prefix: prefix, port: window.location.port, isSecure: window.location.protocol === "https:" }; require.config({ baseUrl: (config.isSecure ? "https://" : "http://" ) + config.host + (config.port ? ":" + config.port : "" ) + config.prefix + "resources" }); require(["js/qlik"], function (qlik) { qlik.setOnError( function (error) { console.log(error); }); //Открыть приложение var app = qlik.openApp('MasteringQlikSense.qvf', config); </script>
После того, как вы создали соединение с приложением, можете начать использовать полный API, создавая гиперкубы (HyperCubes), подключаясь к полям, передавая выборки, извлекая объекты и выполняя другие действия.
Mashup API предназначен для браузерных проектов, в которых проверка подлинности выполняется так же, как если бы вы собирались открыть Qlik Sense. Если вы хотите использовать Mashup API или некоторые его части вместе с серверным решением, вам необходимо сначала позаботиться об аутентификации.
Создание соединения с использованием enigma.js
Enigma – это открытая оболочка Qlik для движка. Вы можете использовать Enigma напрямую, когда находитесь в Mashup API, или можете загрузить ее как отдельный модуль.
Когда вы пишете код из Mashup API, вы можете получить правильную схему прямо из списка доступных модулей, которые загружаются вместе с qlik.js через 'autogenerated/qix/engine-api'.
В следующем примере выполняется подключение к демо-приложению с помощью enigma.js:
define(function () { return function () { require(['qlik','enigma','autogenerated/qix/engine-api'], function (qlik, enigma, schema) { //Базовая конфигурация со всеми заполненными деталями var config = { schema: schema, appId: "My Demo App.qvf", session:{ host:"localhost", port: 4848, prefix: "", unsecure: true, }, } // Теперь, когда у нас есть конфигурация, используйте ее для подключения к сервису //QIX. enigma.getService("qix" , config).then(function(qlik){ qlik.global.openApp(config.appId) //Открыть приложение qlik.global.openApp(config.appId).then(function(app){ //Создать SessionObject для FieldList app.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) } ); }) } })}})
Также важно загружать правильную схему всякий раз, когда вы загружаете enigma.js. Схема представляет собой набор доступных методов API, которые можно использовать в каждой из версий Qlik Sense. Это означает, что ваша схема должна быть синхронизирована с вашей версией QS.
Таким образом, мы видим, что создать стабильное соединение с Qlik Engine API довольно просто.