EducationSoftwareStrategy.com
StrategyCommunity

Knowledge Base

Product

Community

Knowledge Base

TopicsBrowse ArticlesDeveloper Zone

Product

Download SoftwareProduct DocumentationSecurity Hub

Education

Tutorial VideosSolution GalleryEducation courses

Community

GuidelinesGrandmastersEvents
x_social-icon_white.svglinkedin_social-icon_white.svg
Strategy logoCommunity

© Strategy Inc. All Rights Reserved.

LegalTerms of UsePrivacy Policy
  1. Home
  2. Topics

Sample REST API with Python: Generate Auth Token, Create a Cube, Push data to the Cube


Robert Prochowicz

Manager, Sales Engineering • MicroStrategy


MicroStrategy makes it possible for organizations to push external data in JSON format into in-memory cubes that are on the MicroStrategy Intelligence Server to readily consume, process, and analyze the corresponding data. The Push API enables third-party vendors to generate MicroStrategy datasets, thus, unlocking new end-user workflows and opportunities for partner integrations. This sample contains Python code that can be used to: Generate Auth Token, Create a Cube, Push data to the Cube.

REST API documentation can be found here.

ka0PW0000000ouTYAQ_0EM44000000Q8ak.png

MSTR 10.9 was updated and now uses REST Server. For that reason the required syntax has changed as compared to previous versions.
Attached is a Python script that will help you to understand how to push data to cubes in 10.9. The program allows you to :
        1 - Generate and Display Auth Token
        2 - Check session (if it's valid)
        3 - Create a Cube
        4 - Reset the Cube (push sample data)
It is made for Strategy Secure Cloud on AWS, but you can modify it easily for any other MSTR server.
Note - After selecting option (3) the program will display two important parameters: Cube Id and Table ID. You must save it back to the script in Parameters section before you use option (4)
Note - The Dataset API will create and publish the cube in 'My Reports' folder of the user who invoked the API call. You are free to move the cube anywhere else.​
Note - 'request' is a Python library that you need to install in your Python environment (pip install requests) 
 


# JSON DATA PUSH API
# Tested with MSTR 10.9 / 2017-10-16

import requests
import base64

### Parameters ###
environmentId = '12345'
api_login = 'mstr'
api_password = 'XXX'
api_iserver = '10.254.113.99'
project_id = 'B7CA92F04B9FAE8D941C3E9B7E0CD754'
api_projectname = 'Strategy Tutorial'
base_url = "https://env-" + environmentId + ".customer.cloud.Strategy.com/StrategyLibrary/api/"
cube_structure_json = '{"name":"SpeedCarCube1","tables":[{"data":"e30=","name":"Speed_Car_Table","columnHeaders":[{"name":"Timestamp","dataType":"DATETIME"},{"name":"Id_Run","dataType":"STRING"},{"name":"Id_Measure_W","dataType":"DOUBLE"},{"name":"Id_Measure","dataType":"DOUBLE"},{"name":"Driver_Id","dataType":"DOUBLE"},{"name":"Accel_X","dataType":"DOUBLE"},{"name":"Accel_Y","dataType":"DOUBLE"},{"name":"Accel_Z","dataType":"DOUBLE"},{"name":"Gyro_X","dataType":"DOUBLE"},{"name":"Gyro_Y","dataType":"DOUBLE"},{"name":"Gyro_Z","dataType":"DOUBLE"},{"name":"Humidity","dataType":"DOUBLE"},{"name":"Pitch","dataType":"DOUBLE"},{"name":"Pressure","dataType":"DOUBLE"},{"name":"Roll","dataType":"DOUBLE"},{"name":"Temp_H","dataType":"DOUBLE"},{"name":"Yaw","dataType":"DOUBLE"}]}],"metrics":[{"name":"Accel_X","dataType":"DOUBLE","expressions":[{"formula":"Speed_Car_Table.Accel_X"}]},{"name":"Accel_Y","dataType":"DOUBLE","expressions":[{"formula":"Speed_Car_Table.Accel_Y"}]},{"name":"Accel_Z","dataType":"DOUBLE","expressions":[{"formula":"Speed_Car_Table.Accel_Z"}]},{"name":"Gyro_X","dataType":"DOUBLE","expressions":[{"formula":"Speed_Car_Table.Gyro_X"}]},{"name":"Gyro_Y","dataType":"DOUBLE","expressions":[{"formula":"Speed_Car_Table.Gyro_Y"}]},{"name":"Gyro_Z","dataType":"DOUBLE","expressions":[{"formula":"Speed_Car_Table.Gyro_Z"}]},{"name":"Humidity","dataType":"DOUBLE","expressions":[{"formula":"Speed_Car_Table.Humidity"}]},{"name":"Pitch","dataType":"DOUBLE","expressions":[{"formula":"Speed_Car_Table.Pitch"}]},{"name":"Pressure","dataType":"DOUBLE","expressions":[{"formula":"Speed_Car_Table.Pressure"}]},{"name":"Roll","dataType":"DOUBLE","expressions":[{"formula":"Speed_Car_Table.Roll"}]},{"name":"Temp_H","dataType":"DOUBLE","expressions":[{"formula":"Speed_Car_Table.Temp_H"}]},{"name":"Yaw","dataType":"DOUBLE","expressions":[{"formula":"Speed_Car_Table.Yaw"}]}],"attributes":[{"name":"Timestamp","attributeForms":[{"category":"ID","expressions":[{"formula":"Speed_Car_Table.Timestamp"}],"dataType":"STRING"}]},{"name":"Id_Run","attributeForms":[{"category":"ID","expressions":[{"formula":"Speed_Car_Table.Id_Run"}],"dataType":"STRING"}]},{"name":"Id_Measure_W","attributeForms":[{"category":"ID","expressions":[{"formula":"Speed_Car_Table.Id_Measure_W"}],"dataType":"DOUBLE"}]},{"name":"Id_Measure","attributeForms":[{"category":"ID","expressions":[{"formula":"Speed_Car_Table.Id_Measure"}],"dataType":"DOUBLE"}]},{"name":"Driver_Id","attributeForms":[{"category":"ID","expressions":[{"formula":"Speed_Car_Table.Driver_Id"}],"dataType":"DATETIME"}]}]}'
datasetId = "XYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZ" # Cube ID; remember to copy& paste this parameter from step 3
tableId = "XYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZ" # remember to copy& paste this parameter from step 3 !!! IMPORTANT! For Strategy version 10.11 you should use Table name, not table ID! The name has been defined two lines above (Speed_Car_Table).


#### Get token ###
def login(base_url,api_login,api_password):
    print("Getting token...")
    data_get = {'username': api_login,
                'password': api_password,
                'loginMode': 1}
    r = requests.post(base_url + 'auth/login', data=data_get)
    if r.ok:
        authToken = r.headers['X-MSTR-AuthToken']
        cookies = dict(r.cookies)
        print("Token: " + authToken)
        return authToken, cookies
    else:
        print("HTTP %i - %s, Message %s" % (r.status_code, r.reason, r.text))

def get_sessions(base_url, auth_token, cookies):
    print("Checking session...")
    header_gs = {'X-MSTR-AuthToken': auth_token,
                 'Accept': 'application/json'}
    r = requests.get(base_url + "sessions", headers=header_gs, cookies=cookies)
    if r.ok:
        print("Authenticated...")
        print(r)
        print("HTTP %i - %s, Message %s" % (r.status_code, r.reason, r.text))
    else:
        print("HTTP %i - %s, Message %s" % (r.status_code, r.reason, r.text))
    
def create_cube(base_url, auth_token, cookies, project_id, cube_structure_json):
    headers_cc = {'X-MSTR-AuthToken': auth_token,
                  'Content-Type': 'application/json',#IMPORTANT!
                  'Accept': 'application/json',
                  'X-MSTR-ProjectID': project_id}
    print("\nCreating new cube...")
    r = requests.post(base_url + "datasets", headers=headers_cc, data=cube_structure_json, cookies=cookies)
    if r.ok:
        print("Error: " + str(r.raise_for_status()) + "   ||   HTTP Status Code: " + str(r.status_code))
        print("\nCube CREATED successfully")
        print("\nCube ID:     " + r.json()['datasetId'])
        print("Cube Name:   " + r.json()['name'])
        print("Table ID:    " + r.json()['tables'][0]['id'])
        print("Table Name:  " + r.json()['tables'][0]['name'])
        print("\nRemember to copy and note down Cube ID (dataset ID) and Table ID. Enter those values in the Python script 'Parameters' section")
    else:
        print("HTTP %i - %s, Message %s" % (r.status_code, r.reason, r.text))    

def push_data(updatePolicy, pushed_data_json, auth_token, cookies, project_id, datasetId, tableId):
    pushed_data = base64.b64encode(bytes(pushed_data_json, 'utf-8')).decode('ascii')
    push_url = base_url + "datasets/" + datasetId + "/tables/" + tableId
    headers_push = {'X-MSTR-AuthToken': auth_token,
                    'Content-Type': 'application/json',#IMPORTANT!
                    'X-MSTR-ProjectID': project_id,
                    'updatePolicy': updatePolicy
                    }
    insert_data = ('{"name":"Speed_Car_Table",'
                   '"columnHeaders":['
                   '{"name": "Timestamp","dataType": "DATETIME"},'
                   '{"name": "Id_Run","dataType": "STRING"},'
                   '{"name": "Id_Measure_W","dataType": "DOUBLE"},'
                   '{"name": "Id_Measure","dataType": "DOUBLE"},'
                   '{"name": "Driver_Id","dataType": "DOUBLE"},'
                   '{"name": "Accel_X","dataType": "DOUBLE"},'
                   '{"name": "Accel_Y","dataType": "DOUBLE"},'
                   '{"name": "Accel_Z","dataType": "DOUBLE"},'
                   '{"name": "Gyro_X","dataType": "DOUBLE"},'
                   '{"name": "Gyro_Y","dataType": "DOUBLE"},'
                   '{"name": "Gyro_Z","dataType": "DOUBLE"},'
                   '{"name": "Humidity","dataType": "DOUBLE"},'
                   '{"name": "Pitch","dataType": "DOUBLE"},'
                   '{"name": "Pressure","dataType": "DOUBLE"},'
                   '{"name": "Roll","dataType": "DOUBLE"},'
                   '{"name": "Temp_H","dataType": "DOUBLE"},'
                   '{"name": "Yaw","dataType": "DOUBLE"}'
                   '],"data":"' + pushed_data + '"}'
                   )
    print("\nPushing data...")
    r = requests.patch(push_url, headers=headers_push, data=insert_data, cookies=cookies)
    if r.ok:
        print("Pushed successfully...")
        print("HTTP %i - %s, Message %s" % (r.status_code, r.reason, r.text))
    else:
        print("HTTP %i - %s, Message %s" % (r.status_code, r.reason, r.text))

def main():
    authToken, cookies = login(base_url,api_login,api_password)
    choice = None
    while choice != "0":
        print \
        ("""
        ---MENU---
        
        0 - Exit
        1 - Generate and Print Token
        2 - Check session
        3 - Create a Cube        
        4 - Reset the Cube
        """)

        choice = input("Your choice: ") # What To Do ???
        print()
    
        if choice == "0":
            print("Good bye!")  
        elif choice == "1":
            authToken, cookies = login(base_url,api_login,api_password)
        elif choice == "2":
            get_sessions(base_url, authToken, cookies)
        elif choice == "3":
            create_cube(base_url, authToken, cookies, project_id, cube_structure_json)
        elif choice == "4":
            print("Reseting Cube")
            sample_data = '[{"Timestamp": "10/5/2017 7:28:10 PM","Id_Run": "RESET","Id_Measure_W": 1,"Id_Measure": 1,"Driver_Id": 1234,"Accel_X": 0.02546,"Accel_Y": 0.09226,"Accel_Z": 0.97747,"Gyro_X": -0.0123,"Gyro_Y": 0.01709,"Gyro_Z": 0.00736,"Humidity": 38.81998,"Pitch": 358.58579,"Pressure": 980.43262,"Roll": 5.39072,"Temp_H": 34.27213,"Yaw": 67.82173},{"Timestamp": "10/5/2017 7:28:20 PM","Id_Run": "RESET","Id_Measure_W": 2,"Id_Measure": 2,"Driver_Id": 1234,"Accel_X": 0.09999,"Accel_Y": 0.09226,"Accel_Z": 0.97747,"Gyro_X": -0.0123,"Gyro_Y": 0.01709,"Gyro_Z": 0.00736,"Humidity": 38.81998,"Pitch": 358.58579,"Pressure": 980.43262,"Roll": 5.39072,"Temp_H": 34.27213,"Yaw": 67.82173}]'
            push_data('Replace', sample_data, authToken, cookies, project_id, datasetId, tableId)
        else:
            print(" ### Wrong option ### ")

### Main program    
main()

##########

### Sample JSON Syntax that creates the cube via OOTB Web Form
'''
https://env-61410.customer.cloud.Strategy.com:10443/json-data-api/#/
{"name":"cubeName3","tables":[{"data":"e30=","name":"RACE_DATA","columnHeaders":[{"name":"ID_Run","dataType":"STRING"},{"name":"gyro_z","dataType":"DOUBLE"}]}],"metrics":[{"name":"gyro_z","dataType":"number","expressions":[{"formula":"RACE_DATA.gyro_z"}]}],"attributes":[{"name":"ID_Run","attributeForms":[{"category":"ID","expressions":[{"formula":"RACE_DATA.ID_Run"}],"dataType":"string"}]}]}
'''

### Update Policy
'''
Add - Adds new data if it does not exist in the current dataset table. Does not replace data if it already exists in the current dataset table.
Update - Replaces data if it does exist in the current dataset table. Does not add new data if it does not exist in the current dataset table.
Upsert - Adds new data if it does not exist in the current dataset table. Replaces data if it does exist in the current dataset table.
Replace - Replaces all the existing data in the dataset table with new imported external data.
'''

 


Comment

0 comments

Details

Example

Published:

November 3, 2017

Last Updated:

February 16, 2024