PHP - Consumir datos de GraphQL

 
Vista:
sin imagen de perfil
Val: 17
Ha aumentado su posición en 7 puestos en PHP (en relación al último mes)
Gráfica de PHP

Consumir datos de GraphQL

Publicado por Pavel (15 intervenciones) el 18/07/2021 02:53:25
Hola a todos

quisiera que me apoyen con lo siguiente.

soy nuevo con GraphQL y no se como puedo consumir los datos de este API, por favor su apoyo urgente.

debo de hacer una primera consulta a GraphQL el cual me debe de generar una llave.
después debo generar otra consulta que me debe de dar los resultados, pero no se ni como empezar.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Consumir datos de GraphQL

Publicado por Mauro (1036 intervenciones) el 18/07/2021 16:44:21
Hola Pavel!

¿Estás usando alguna API en particular? ¿Puedes mostrar algo de código?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 17
Ha aumentado su posición en 7 puestos en PHP (en relación al último mes)
Gráfica de PHP

Consumir datos de GraphQL

Publicado por Pavel (15 intervenciones) el 19/07/2021 05:50:19
Hola Mauro muchas gracias por contestarme

el proveedor del que debo extraer los datos indica que se debe de consumir los datos de su API GraphQL y solo deja un ejemplo en phyton

este es el codigo que deja para solicitar el token de autenticación

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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.paginadedeprueba.com/oauth/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']

y este es el codigo para extraer los datos tambien en phyton

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# obtenido el token temporal (access_token) podremos realizar llamadas al graphql
 
api_url = 'https://api.pagina.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")


pero no tengo codigo en php y no se como poder hacerlo para php
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Consumir datos de GraphQL

Publicado por Mauro (1036 intervenciones) el 19/07/2021 19:34:59
Hola!

Ok, por lo que veo se trata de comunicarse a través de un servicio Rest que retorna Json. Hacerlo en php no es complejo.

Podés usar cUrl, file_get_contents o algo más elaborado como el cliente de HTTP de Symfony.

En tu caso pienso que con file_get_contents vas a andar bien.

En este articulo podés ver más detalles.

Consultame cualquier duda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 17
Ha aumentado su posición en 7 puestos en PHP (en relación al último mes)
Gráfica de PHP

Consumir datos de GraphQL

Publicado por Pavel (15 intervenciones) el 23/07/2021 16:39:57
Hola Mauro

Disculpa mi demora primero agradecerte por tu respuesta tan rápida, estuve revisando y realizando pruebas en la obtención del token me funcionó de maravilla, pero al momento de sacar los datos me sale el siguiente error
“{ "errors" : [ { "message" : "Invalid JSON payload in GraphQLAuth POST request.", "errorType" : "MalformedHttpRequestException" } ] }”

el codigo en Pyton es este:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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")

mi codigo en php es este:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
$array_cabecera =['Authorization'=> $token_diario];
 
$array = ['query'=>'
        query {
            getData(
                companies: []
                brands: []
                locations: [522]
                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 = http_build_query($array);
$iniciar = curl_init();
curl_setopt($iniciar,CURLOPT_URL, $uri);
curl_setopt($iniciar, CURLOPT_POST, true);
curl_setopt($iniciar, CURLOPT_HTTPHEADER, $array_cabecera);
curl_setopt($iniciar, CURLOPT_POSTFIELDS, $data);
//curl_setopt($iniciar, CURLOPT_RETURNTRANSFER, true);
 
$respuesta = curl_exec($iniciar);
 
if(curl_errno($iniciar)) echo curl_error($iniciar);
else $resp = json_decode($respuesta, true);
 
foreach ($resp as $obj=> $valor){
 
    echo "$obj : $valor";
}
curl_close($iniciar);

converse con el proveedor de los datos y me comenta lo siguiente:

El problema que he visto es que no está bien formado el JSON que estás enviando. Debe ser un JSON correcto. Solo es aceptado un JSON con “ dobles, las comillas simples no son aceptadas.
He probado a enviarlo con POSTMAN y he visto que al enviar las fechas entre comillas “2021-01-01” no cumple con el formato de JSON, pues posiblemente está enviando la query de la siguiente forma: { “query”: “ query { getData ….. “2021-01-01” … etc.
Como puedes ver te envia comillas en la fecha lo que entra en conflicto con las comillas iniciales.
Te paso la query en una sola línea teniendo en cuenta las comillas tal y como tiene que recibirla el servidor en el body del request. Ignoro como PHP envia los datos, pero no sé si la opción de la variable $array con el parametro es correcto para pasar este body en la petición. Además ten en cuenta que el Content-Type en el header debes especificar application/json para que lo lee correctamente.
{
"query": "query { getData( companies: [] brands: [] locations: [522] 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 } }"
}
Fijate que las comillas de las fechas son

por favor tu apoyo para tener luces de como puedo resolver lo que me indica
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 17
Ha aumentado su posición en 7 puestos en PHP (en relación al último mes)
Gráfica de PHP

Consumir datos de GraphQL

Publicado por Pavel (15 intervenciones) el 27/07/2021 18:30:00
muchas gracias ya pude resolver el problema
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar