Descarga de datos. Formando llamadas con GraphQL

Aprenda a autenticarse en la API GraphQL y luego aprenda a crear y ejecutar consultas y mutaciones.

El end point de GraphQL

El API GraphQL de tbRetail tiene 2 end points, uno para realizar las llamadas de test y otro para realizar las llamadas de producción:

End Point de test: https://apitest.tbretail.com

End Point de producción: https://api.tbretail.com

Autenticarse con GraphQL

Para comunicarse con el servidor GraphQL, necesitará un token OAuth con los alcances (scopes) correctos.

  1. Obtener un token de usuario: Este token de acceso estará asociado al usuario y permitirá obtener los datos que el usuario tiene acceso en la aplicación.

  2. Obtención del token de acceso temporal: Una vez obtenido en el paso 1 un token de usuario, se podrá realizar una petición al servidor para obtener un token temporal de acceso. Este token temporal tiene una validez de 24 horas. Transcurrido dicho periodo deberá solicitarse un nuevo token temporal para poder solicitar los datos. La url de autentificación en la fase de pruebas:

Los valores de las variables para realizar la petición de datos son las siguientes:

Variables

Valor

Variables

Valor

client_id para test

14fuos4vd8u14utepgl46fhjob

client_id para producción

63h4jubc7qvrg9f65c36vjp3bq

redirect_uri en test

https://stage.tbretail.com/mytoken/index.html

redirect_uri en producción

https://login.tbretail.com/mytoken/index.html

refresh_token

Token obtenido en el paso 1

 Código de ejemplo en python

 

import requests import json import datetime refresh_token = "<inserte token obtenido en paso 1>" client_id = '<inserte client id>' redirect_uri = '<inserte redirect uri' # realizar la peticion de autenticacion para obtener el token temporal de acceso token_url = 'https://auth.tbretail.com/oauth2/token' headers = {'Content-Type': 'application/x-www-form-urlencoded'} data = {'grant_type': 'refresh_token', 'client_id': client_id, 'redirect_uri': redirect_uri, 'refresh_token': refresh_token} token_response = requests.post(token_url, data=data, verify=False, allow_redirects=False, headers=headers) access_token = token_response.json()['access_token']

Esta petición devolverá el access_token que podrá ser usado para realizar las peticiones al servidor.

 Petición de datos al servidor para descargar información

La petición se debe realizar haciendo un POST al end point de pruebas o de producción.

El formato de la query debe ser el siguiente:

 

query { getData ( locations: […] start_date: “YYYY-MM-DD” end_date: “YYY-MM-DD” category: { dimension: MONTH interval: 1 } metrics: [{ name: ENTERS operation: SUM}] group: {dimension: LOCATION} ) { categories series { group metric data } } }

Los parámetros de la query son los siguientes:

Campo

Descripción

locations

Lista de id’s de las locations a solicitar

start_date

Fecha de inicio en formato YYYY-MM-DD

end_date

Fecha final en formato YYYY-MM-DD

category

Objeto con los parámetros que se describen a continuación

category.dimension

Pueden ser los siguientes valores:

YEAR, QUARTER, MONTH, DAY, HOUR, MINUTE

category.interval

Intervalo de la petición. 1, 2, 3 .. etc.

Por ejemplo para pedir cada 15 minutos, se debe solicitar en la dimension MINUTE y en el interval 15.

group

Puede ser COMPANY, BRAND, LOCATION, ZONE

Permite devolver la información agrupada.

metrics

Lista de métricas a solicitar y la operación a realizar

ENTERS, EXITS, GROUP ENTERS, GROUP EXITS

operaciones: SUM, AVG, MAX, MIN

Codigo de Ejemplo Python:

# obtenido el token temporal (access_token) podremos realizar llamadas al graphql api_url = 'https://api.tbretail.com' headers = { 'Authorization': access_token } json_data = { "query": """ query { getData( companies: [] brands: [] locations: [3] zones: [] start_date: "2021-01-01" end_date: "2021-01-30" metrics: [{name: ENTERS, operation: SUM}] category: {dimension: DAY interval: 1} group: {dimension: LOCATION} ) { series { group metric data } categories } } """ } data_response = requests.post(api_url, json=json_data, headers=headers) # una vez obtenidos los datos se pueden transformar # en una lista json_data = json.loads(data_response.content) result_getdata = json_data['data']['getData'] if result_getdata: series = result_getdata['series'] categories = result_getdata['categories'] print ("group_id,start_datetime,metric,value") for serie in series: group_id = serie['group'] metric = serie['metric'] serie_data = serie['data'] for category in categories: unixdate = int(category) / 1000 starttime = datetime.datetime.utcfromtimestamp(unixdate) value = serie_data[categories.index(category)] line = "%s,%s,%s,%s" % ( group_id, starttime.strftime("%Y-%m-%d %H:%M:%S"), metric, value ) print (line) else: print ("No hay datos")

Este ejemplo devolverá la siguiente lista por pantalla:

 

Artículos Relacionados