APIs e Microsserviços

24 jan, 2018

Flexibilidade e eficiência em suas APIs com GraphQL no Node.js

Publicidade

GraphQL

O GraphQL é uma linguagem de consulta de dados, de código aberto e fortemente tipada para APIs em tempo de execução, desenvolvida e usada desde 2012 pelo Facebook. Ele funciona com um sistema de tipos onde é possível criar um schema para a API. Com ele, podemos obter uma validação das consultas feitas pela aplicação para saber o que foi requisitado e retornar exatamente o que foi requisitado. Nada mais e nada menos.

Com essa validação, evitamos a busca de dados desnecessária, otimizando assim a sobrecarga (over fetching), que é um grande problema em API’s REST (e por outro lado resolvendo o problema da falta de dados, o under fetching). Ainda é possível evoluir a sua API sem a necessidade de novas versões, basta incluir novos tipos à ela sem afetar as consultas já existentes.

Outra coisa que vale a pena mencionar, é que em uma única consulta., é possível obter muitos recursos, pois as consultas GraphQL acessam não somente as propriedades de um recurso, mas também seguem as referências entre eles. Enquanto as APIs REST exigem o carregamento de várias URLs, as APIs GraphQL obtêm todos os dados que seu aplicativo precisa somente com uma única consulta.

Aí pode surgir a dúvida. Mas se o cliente pode especificar o que quer consultar, então não parece ser uma ferramenta segura, certo? Errado. O GraphQL possui os chamados resolvers que tem a função de cuidar da segurança dos dados, permitindo ou não que o cliente possa acessar alguns dados específicos.

Os três tipos de requisições GraphQL que o cliente pode enviar são:

  • Query: para consultas;
  • Mutation: para enviar dados;
  • Subscription: para comunicação baseada em eventos.

Outra coisa interessante é que não há uma linguagem ou uma tecnologia recomendada para um servidor ou um cliente aceitar ou enviar requisições GraphQL, ou seja, um servidor aceita requisições de qualquer linguagem usando qualquer banco de dados, e um cliente que enviam requisições podem ser implementados por qualquer tecnologia (desktop, mobile, etc).

Vamos dar uma olhadinha em como tudo isso é na prática.

GraphQL com Node.js

Agora que já sabemos o que é e como funciona o GraphQL na teoria, vamos criar uma mini API com Node.js usando o graphql-js, que é a implementação do GraphQL no JavaScript. Também utilizaremos o express-graphql, que é um middleware que faz a customização do servidor HTTP do express para ter suporte ao estilo do GraphQL.

Primeiramente, dentro da pasta do projeto, crie o package.json com o comando:

npm init 

Logo após, instale os três módulos que vamos precisar na nossa mini API:

npm install graphql express-graphql express --save

Agora vamos criar um arquivo chamado fruits.json dentro do nosso projeto. Nele, estarão contidos os dados de três frutas aleatórias:

[
  {
	"id":1,
	"name":"Banana",
	"color":"Yellow",
	"vitamins":[
  	    { "name":"Vitamin C" },
  	    { "name":"Vitamin A" }
	]
  },
  {
	"id":2,
	"name":"Orange",
	"color":"Orange",
	"vitamins":[
  	    { "name":"Vitamin C" },
  	    { "name":"Vitamin E" }
	]
  },
  {
	"id":3,
	"name":"Apple",
	"color":"Red",
	"vitamins":[
  	    { "name":"Vitamin A"  },
  	    { "name":"Vitamin B1" },
  	    { "name":"Vitamin B2" }
	]
  }
]

Agora vamos criar o arquivo schema.js:

Linguagem: JavaScript

Observe que criamos acima dois GraphQLObjectType, chamados vitaminsType e fruitType, que funcionarão como modelos para nosso schema. Ele irá receber os GraphQLObjectType com as propriedades “name” e “fields” que é onde ficam os métodos que poderemos usar nas pesquisas.

Em nossa API, temos o “fruit” que irá usar o “fruitType” passado na propriedade “type” como tipo de dado a ser manipulado, e em “args” foi passado os argumentos que este método deve receber para fazer a operação, no caso, o argumento “id”. A propriedade resolve de fruit recebe uma função que será responsável por pesquisar e retornar a fruta que possui o id passado como argumento.

Por fim, vamos criar o arquivo index.js. Nele, vamos iniciar o servidor na porta 3000 com o express e determinar a rota “/fruit” para o schema, passando a função graphqlHTTP({schema:fruits, pretty: true}) para poder ser chamado quando for feita a requisição nesta rota.

const graphql = require('graphql')
const graphqlHTTP = require('express-graphql')
const express = require('express')
const fruits = require('./schema')
const app = express()

app.use('/fruit', graphqlHTTP({schema:fruits, pretty: true}))
app.listen(3000, function () {
  console.log('Server online.')
})

Pronto, agora só falta iniciar o servidor pelo terminal com o comando:

node index.js 

E acessar a url com os parâmetros que você deseja pesquisar, como por exemplo:

Repare que irá retornar exatamente os dados que pedimos como parâmetros na url. Bem legal, né? Você pode acessar esse exemplo no Git.

E ai, o que achou do GraphQL? Já tinha usado em algum projeto ou acha que vai usá-lo agora? Compartilhe com a gente suas experiências e dúvidas nos comentários!