Qlik Community

Ask a Question

Brasil

Announcements
Support Cases coming to Qlik Community Oct. 4! Start chats, open cases, explore resources. READ DETAILS>
cancel
Showing results for 
Search instead for 
Did you mean: 
jptneumann
Partner
Partner

GraphQL: Como usar no Qlik Sense a Evolução das APIs Web

O GraphQL tem ganhado cada vez mais adesão para construção de APIs Web, sendo uma alternativa para arquiteturas REST.

O GraphQL é uma linguagem de consulta para APIs criada pelo Facebook, que pode ser usado com qualquer framework ou linguagem de programação, facilitando o processo de requisições de dados. Diversas limitações do modelo REST são resolvidos do GraphQL que independe de codificação dos recursos para se adaptar às mudanças na fonte de dados, permitindo enorme liberdade para escolher quais dados deseja recuperar.

O GraphQL possuí interessantes funcionalidades como: queries (operações de consulta de dados com uma liberdade jamais vista no modelo REST), mutations (utilizadas quando desejamos inserir ou alterar dados em nossa API) e subscriptions (torna possível reagir a modificações de informações na fonte de dados dentro dos clientes de uma API GraphQL em tempo real).

Outro aspecto importante do GraphQL é que ele não é acoplado com nenhuma tecnologia de armazenamento de dados. Para uma mesma API GraphQL, você pode ter diferentes resolvers (Ex: um para Hadoop, outro para PortgreSQL e outro para arquivos flats como CSV).

O GraphQL é orientado aos schemas o que permite mudanças sem que isso impacte em novos recursos ou em versionamentos de API, mitigando uma possível quebra entre o servidor da API e seus clientes. Adicione novos campos e tipos à sua API do GraphQL sem afetar as consultas existentes. Os campos antigos podem ser preteridos e ocultos das ferramentas. Usando uma única versão em evolução, as APIs GraphQL oferecem aos aplicativos acesso contínuo a novos recursos e incentivam códigos de servidor mais limpos e mais fáceis de manter.

Maiores informação em https://graphql.org.

E como acessar dados de uma fonte GraphQL no Qlik Sense?

Com o uso cada vez maior do GraphQL como fonte de dados, vamos apresentar neste post como realizar uma carga de dados de uma fonte GraphQL.

Nos exemplos abaixo, vamos usar uma fonte GraphQL (http://localhost:5000/graphql), que possui 2 conjuntos/tabelas de dados:

estados
id (int) --Chave única do registro e Código IBGE do estado
nome_uf (text) --Nome do estado
uf (text) --Sigla do estado

municipios
id (int) --Chave única do registro
uf_id (int) --Foreing key para estados(id)
cod_municipio (int) --Código IBGE do municipio
nome_municipio (text) --Nome do munícipio

Já que não temos no Qlik Sense um conector focado na tecnologia GraphQL, iremos utilizar o conector REST.

A URL de todas as conexões de uma mesma fonte GraphQL serão em geral iguais, mesmo para requisições diferentes. No nosso exemplo vamos usar um servidor local cuja URL é http://localhost:5000/graphql.

IMPORTANTE: Na criação da conexão colocar no header (Query Headers do conector REST do QS) a chave Content-Type: application/graphql

Inicialmente, vamos fazer uma consulta para retornar todos os dados dos estados.

Nossa consulta, então será:

 

#Todos os Estados
query {
  allEstados {
    edges {
      node {
        id
        uf
        nomeUf
      }
    }
  }
}

 

Minha sugestão é testar antes suas consultas GraphQL, usando ferramentas como o GraphiQL ou o velho e sempre atual Postman (que na nova versão já inclui suporte nativo ao GraphQL).

GraphQL-QS-Img1.jpgImagem 1 - GraphiQL

GraphQL-QS-Img2.jpg
imagem 2 - Postman Request

GraphQL-QS-Img2a.jpgimagem 2a - Postman Request Result

Lembrando no Postman de colocar a Header key Content-Type:application/graphql:

GraphQL-QS-Img3.jpgimagem 2a - Postman GraphQL Header Key

O resultado da consulta será o seguinte json:

 

{
    "data": {
        "allEstados": {
            "edges": [
                {
                    "node": {
                        "id": 11,
                        "uf": "RO",
                        "nomeUf": "Rondônia"
                    }
                },
                {
                    "node": {
                        "id": 12,
                        "uf": "AC",
                        "nomeUf": "Acre"
                    }
                },
                {
                    "node": {
                        "id": 13,
                        "uf": "AM",
                        "nomeUf": "Amazonas"
                    }
                },
		.
		.
		.
            ]
        }
    }
}

 

No GraphQL, podemos determinar quais os campos que queremos recuperar. Vamos alterar o exemplo acima para trazer apenas os nomes dos estados:

 

#Todos os Estados - Somente o nome
query {
  allEstados {
    edges {
      node {
        nomeUf
      }
    }
  }
}

 

o resultado da consulta será:

 

{
  "data": {
    "allEstados": {
      "edges": [
        {
          "node": {
            "nomeUf": "Rondônia"
          }
        },
        {
          "node": {
            "nomeUf": "Acre"
          }
        },
        {
          "node": {
            "nomeUf": "Amazonas"
          }
        },
        .
	.
	.
        }
      ]
    }
  }
}

 

E no Qlik Sense.... Afinal é o que nos interessa!!!

Inicialmente vamos criar uma conexão REST no Qlik Sense, chamado MyGraphyQL, com as seguintes configurações:

URL = http://localhost:5000/graphql (meu servidor GraphQL. Substitua pela url da sua fonte de dados)
Method = POST
Query headers =  Name: Content-Type     Value: application/graphql
Reques body = A consulta GraphQL.  Neste caso:

 

query {
  allEstados {
	edges {
	  node {
		id
		uf
		nomeUf
	  }
	}
  }
}

 

 

GraphQL-QS-Img4a.jpgGraphQL-QS-Img4b.jpgGraphQL-QS-Img4c.jpg
Imagem 4a, 4b, 4c - Configuração Conexão REST MyGraphQL

Uma vez criado a conexão chamada MyGraphyQL, clicar em Selecionar Dados:

GraphQL-QS-Img5.jpg

Imagem 5 - icone Selecionar Dados

Então, Voalá!!

GraphQL-QS-Img6.jpg

Imagem 6 - Tela de Seleção de Dados

Então o script final será:

GraphQL-QS-Img7.jpg

Imagem 7 - Script Carga GraphQL no Qlik Sense

Executar a carga de dados

GraphQL-QS-Img8.jpg

Imagem 8 - Execução da Carga de Dados GraphQL

E finalmente os dados obtidos via GraphQL, incorporados na nossa aplicação:

GraphQL-QS-Img9.jpg

Imagem 9 - Painel Qlik Sense Com Dados Obtidos Via GraphQL

A flexibilidade de selecionar os dado em uma API GraphQL, permite fazer uma grande variação de consultas.

Se desejamos uma consulta para trazer todos os município de cada estado, basta executar a seguinte query:

 

#Todos os Municípios e Estados V2
query {
  allMunicipios {
    edges {
      node {
        id
        estadoByUfId{ 
          uf
          nomeUf
        }
        nomeMunicipio
        codMunicipio
      }
    }
  }
}

 

O Resultado Será:

 

{
  "data": {
    "allMunicipios": {
      "edges": [
        {
          "node": {
            "id": 1,
            "estadoByUfId": {
              "uf": "RO",
              "nomeUf": "Rondônia"
            },
            "nomeMunicipio": "Alta Floresta D'Oeste",
            "codMunicipio": 1100015
          }
        },
        {
          "node": {
            "id": 2,
            "estadoByUfId": {
              "uf": "RO",
              "nomeUf": "Rondônia"
            },
            "nomeMunicipio": "Ariquemes",
            "codMunicipio": 1100023
          }
        },
	.
	.
	.
	}
      ]
    }
 }

 

Se desejar apenas os municípios de Alagoas (Código IBGE = 27), ordenado pelo nome do município, usar a query a seguir:

 

#Todos os Municípios do Estado de Alagoas Ordenado pelo nome do município
query {
  allMunicipios(condition: {ufId:27} orderBy: NOME_MUNICIPIO_ASC) {
    edges {
      node {
        id
        nomeMunicipio
        codMunicipio
        estadoByUfId{
          uf
          nomeUf
        }
      }
    }
  }
}

 

O resultador será:

 

{
  "data": {
    "allMunicipios": {
      "edges": [
        {
          "node": {
            "id": 1651,
            "nomeMunicipio": "Água Branca",
            "codMunicipio": 2700102,
            "estadoByUfId": {
              "uf": "AL",
              "nomeUf": "Alagoas"
            }
          }
        },
        {
          "node": {
            "id": 1652,
            "nomeMunicipio": "Anadia",
            "codMunicipio": 2700201,
            "estadoByUfId": {
              "uf": "AL",
              "nomeUf": "Alagoas"
            }
          }
        },
	.
	.
	.
        }
      ]
    }
  }
}

 

Você também pode na consulta acima, fazer controle do número de registros retornados e até mesmo paginação:

 

#Todos os Municipios do Estado de Alagoas com controle de paginação
query {
  allMunicipios(first: 5
    			offset: 0
    			condition: {ufId:27} 
    			orderBy: NOME_MUNICIPIO_ASC) {
    totalCount
    pageInfo {
      hasNextPage
      startCursor
      endCursor
    }
    edges {
      node {
        id
        nomeMunicipio
        codMunicipio
        estadoByUfId{
          uf
          nomeUf
        }
      }
    }
  }
}

 

O resultado será:

 

{
  "data": {
    "allMunicipios": {
      "totalCount": 103,
      "pageInfo": {
        "hasNextPage": true,
        "startCursor": "WyJub21lX211bmljaXBpb19hc2MiLFsiw4FndWEgQnJhbmNhIiwxNjUxXV0=",
        "endCursor": "WyJub21lX211bmljaXBpb19hc2MiLFsiQXRhbGFpYSIsMTY1NF1d"
      },
      "edges": [
        {
          "node": {
            "id": 1651,
            "nomeMunicipio": "Água Branca",
            "codMunicipio": 2700102,
            "estadoByUfId": {
              "uf": "AL",
              "nomeUf": "Alagoas"
            }
          }
        },
	.
	.
	.
        }
      ]
    }
  }
}

 

O GraphQL deve ser cada vez mais usado, e espero que este artigo tenha ajudado a entender um pouco seu potencial e seu uso no Qlik Sense.

That's All Folks!!!! See You Later....

 

3 Replies
MarkimTI
Contributor
Contributor

Alguém configurou a conexão Rest com GraphQL e usou token?

Seria ótimo se você compartilhasse informações sobre as configurações para este tipo de conexão.

No Headers da conexão Rest eu adiciono "Content-Type = application/graphql" e "Authorization = ******* "

Mais ocorre o ERRO:


RestConnectorMasterTable:
SQL SELECT
"account_id",
"__KEY_root",
(SELECT
"message",
"__FK_errors"
FROM "errors" FK "__FK_errors")
FROM JSON (wrap on) "root" PK "__KEY_root";

[errors]:
LOAD [message],
[__FK_errors] AS [__KEY_root]
RESIDENT RestConnectorMasterTable
WHERE NOT IsNull([__FK_errors]);


[root]:
LOAD [account_id],
[__KEY_root]
RESIDENT RestConnectorMasterTable
WHERE NOT IsNull([__KEY_root]);


DROP TABLE RestConnectorMasterTable;

 

thiago_justen

Recomendo o post: Qlik Sense Data Connectivity/Load data from GraphQL 

 

Abs e Sucesso!!

Thiago Justen Teixeira Gonçalves
WhatsApp: 24 98152-1675
Skype: justen.thiago
jptneumann
Partner
Partner
Author

Olá @MarkimTI ,

A autorização é passada no Header. Porém tem que saber qual o tipo de autorização que sua API requer:  Bearer Token,  Basic Auth, etc.

Você pode passar de 2 formas: Na conexão ou no script.

Na Conexão deve ser feito desta forma (exemplo usando Bearer Token):

AuthAPI.jpg

 

 

 

No Script você usa a instrução WITH CONNECTION (exemplo usando Basic Token):

...
WITH CONNECTION( Url "https://<url api>"
,HTTPHEADER "Autorization" "Basic 823rhwed8eg98TGKgssg7");