Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Hi,
I’d like to reload a POC application in QlikSense Desktop.
It should be done in Python, due to there are related process which has been developed on this language.
When I called the WebSocket I got the next error:
{
"jsonrpc":"2.0",
"id":3,
"error":{
"code":-32602,
"parameter":"Invalid handle",
"message":"Invalid Params"
}
}
I have used this Python code:
from websocket import create_connection
qlik_ws_url = "ws://127.0.0.1:4848/app/C%3A%5CUsers%5Cvirilo.tejedor%5CDocuments%5CQlik%5CSense%5CApps%5CPOC.qvf"
qlik_ws_url="ws://localhost:4848/app/jbGFs"
ws = create_connection(qlik_ws_url)
# 1st try
"""
params='''{"handle": "1",
"method": "DoReload",
"params": {
"qMode": "0",
"qPartial": "false",
"qDebug": "false"
}}'''
"""
params='''{
"handle": 1,
"method": "DoReload",
"params": {
"qMode": 0,
"qPartial": "false",
"qDebug": "false"
},
"jsonrpc": "2.0",
"id": 3
}'''
print("params:")
print(params)
ws.send(params)
print ("Sent")
print ("Receiving...")
result = ws.recv()
print ("Received '%s'" % result)
ws.close()
I already did successfully a WebSocket call with the same python code to GetDocList remote procedure, using params = "{\"method\":\"GetDocList\",\"handle\":-1,\"params\":[],\"id\":7,\"jsonrpc\":\"2.0\"}";
I tried several combinations of url for the endpoint. I got the application id following this instructions: https://help.qlik.com/en-US/sense-developer/3.0/Subsystems/Mashups/Content/Howtos/mashups-obtain-app...
Any help will be welcomed.
Thanks in advance,
Virilo
A Engine session can only open a app once, if you try to call OpenDoc in a engine session that already has a document opened that's when you get the "App already opened" error. And since you have the app opened in the same session in Desktop you won't be able to call OpenDoc from your program.
However you can easily check for that error and instead call GetActiveDoc which will return you a handle the currently opened document.
Hi Virilo,
Looks like you have an active connection but you haven't opened the app. Try calling the "OpenDoc" method and passing in your appname as a parameter -
The response from that will give you the doc handle and you can then call DoReload.
I hope that helps.
Thanks
Nick
Hi Nick,
Thanks for your answer!
I used OpenDoc before the ReLoad, and it worked.
But once the application is opened via Desktop application, the same error is returned.
These are the responses obtained doing DoReload call with QlikDestop started and no application opened:
params:
{
"handle": -1,
"method": "OpenDoc",
"params": {
"qDocName": "POC.qvf",
"qUserName": "",
"qPassword": "",
"qSerial": "",
"qNoData": false
}
}
Sent
Receiving...
Received '{"jsonrpc":"2.0","id":0,"result":{"qReturn":{"qType":"Doc","qHandle":1}},"change":[1]}'
params:
{
"handle": 1,
"method": "DoReload",
"params": {
"qMode": 0,
"qPartial": false,
"qDebug": false
},
"jsonrpc": "2.0",
"id": 3
}
Sent
Receiving...
Received '{"jsonrpc":"2.0","id":3,"result":{"qReturn":true},"change":[1]}'
Responses when QlikDestop is started and the application opened:
params:
{
"handle": -1,
"method": "OpenDoc",
"params": {
"qDocName": "POC.qvf",
"qUserName": "",
"qPassword": "",
"qSerial": "",
"qNoData": false
}
}
Sent
Receiving...
Received '{"jsonrpc":"2.0","id":0,"error":{"code":1002,"parameter":"POC.qvf","message":"App already open"}}'
params:
{
"handle": 1,
"method": "DoReload",
"params": {
"qMode": 0,
"qPartial": false,
"qDebug": false
},
"jsonrpc": "2.0",
"id": 3
}
Sent
Receiving...
Received '{"jsonrpc":"2.0","id":3,"error":{"code":-32602,"parameter":"Invalid handle","message":"Invalid Params"}}'
Python code with the OpenDoc call:
from websocket import create_connection
#qlik_ws_url="ws://localhost:4848/app/jbGFs"
qlik_ws_url = "ws://localhost:4848/app/ C%3A%5CUsers%5Cvirilo.tejedor%5CDocuments%5CQlik%5CSense%5CApps%5CPOC.qvf"
ws = create_connection(qlik_ws_url)
params='''{
"handle": -1,
"method": "OpenDoc",
"params": [
"POC.qvf"
],
"outKey": -1
}'''
print("params:")
print(params)
ws.send(params)
print ("Sent")
print ("Receiving...")
result = ws.recv()
print ("Received '%s'" % result)
params='''{
"handle": 1,
"method": "DoReload",
"params": {
"qMode": 0,
"qPartial": false,
"qDebug": false
},
"jsonrpc": "2.0",
"id": 3
}'''
print("params:")
print(params)
ws.send(params)
print ("Sent")
print ("Receiving...")
result = ws.recv()
print ("Received '%s'" % result)
ws.close()
Using Engine Api Explorer app at http://127.0.0.1:4848/dev-hub/engine-api-explorer it is possible to do the reload, even when the application is already opened by Desktop application.
Any suggestion?
Best regards,
Virilo
Make sure you call DoSave to persist your changes and new data.
Hi Alexander,
I improved the code with the DoSave call. Now changes are persisted after reload.
But the main problem still remains: the script runs successfully only when the application is closed.
If the POC.qvf application is opened by QlikSense Desktop vía Windows application or by Engine API Explorer, the Python WebSocket call fails returning "App already open".
This time the error message is very clear, but it should be possible to do a reload even with the application opened.
Al least, I can do it using WebSockets from a HTML client, doing the following steps:
But doing the same using the Python WebSocket call, it fails on step 2:
What could be happening?
Is there any alternative to open POC.qvf application from Python WebSocket in a concurrent way?
Best regards,
Virilo
A Engine session can only open a app once, if you try to call OpenDoc in a engine session that already has a document opened that's when you get the "App already opened" error. And since you have the app opened in the same session in Desktop you won't be able to call OpenDoc from your program.
However you can easily check for that error and instead call GetActiveDoc which will return you a handle the currently opened document.
Problem solved. Thanks a lot!
Best regards,
Virilo
Hi dear Virilo
Thanks for the post, was wonderful for me, I have a problem with DoReload method, the result response is parameter invalid, I'm using your code and verified the parameters with API explorer and are well, I don't know what is the error, Can you Help me? Please
Hi dear Virilo
See the images with code and error
Hi Dear friends
I used Virilio's code and create the following code to Open, ActiveDocument, Reload and save, the last option (share) i'm getting better because still fail, if is possible can you review and help me to solve the issue
from websocket import create_connection
import time
qlik_ws_url = "ws://localhost:4848/app/C%3A%5CUsers%5CMarcos%20Herrera%5CDocuments%5CQlik%5CSense%5CApps%5C00_App.qvf"
# qlik_ws_url="ws://localhost:4848/app/jbGFs"
print("Conecting to QS")
ws = create_connection(qlik_ws_url)
print("Conected")
################################################################################
print("Opening Doc...")
params = '''{
"handle": -1,
"method": "OpenDoc",
"params": [
"00_App.qvf"
],
"outKey": -1
}'''
print("params:")
print(params)
ws.send(params)
print("Sent OpenDoc")
print("Receiving OpenDoc...")
result = ws.recv()
print("Received OpenDoc '%s'" % result)
################################################################################
print("###########################GetActiveDoc#####################################################")
params = '''{
"handle": -1,
"method": "GetActiveDoc",
"params": {}
}
'''
print("params:")
print(params)
ws.send(params)
print("Sent GetActiveDoc")
print("Receiving GetActiveDoc...")
result = ws.recv()
print("Received '%s'" % result)
################################################################################
print("###########################Reloading Doc#####################################################")
params = '''{"handle": 1,"method": "DoReload","params": {"qMode": 0,"qPartial": false,"qDebug": false}}'''
print("params:")
print(params)
ws.send(params)
print("Sent DoReload")
print("Receiving DoReload...")
result = ws.recv()
time.sleep(5)
print("Received '%s'" % result)
################################################################################
print("###########################Saving Doc#####################################################")
params = '''{"handle": 1,"method": "DoSave","params": {"qFileName": ""}}'''
print("params:")
print(params)
ws.send(params)
print("Sent Saving Doc")
print("Receiving Saving Doc...")
result = ws.recv()
print("Received '%s'" % result)
ws.close()
This is the answer of DocSave Method:
Received '{"jsonrpc":"2.0","id":0,"result":{"qReturn":true},"change":[1]}'
But the document not save, if you verify the modified date on File Explorer not change, another interesting thing is if you compare the answer on Python vs Answer on Engine Api Explorer if the same, but when you execute on API Enginee Explored worked