Hands On GraphQL: Faça sua primeira API!

Breno Henrique
Equals Lab
Published in
4 min readNov 30, 2017

Olá! Esse artigo surgiu de uma talk que fiz aqui na Equals.
Os slides dessa apresentação você pode encontrar aqui.

Vamos codar uma GraphQL API com Express & JSON Server

Disclaimer: Esse é um hands on com a GraphQL, uma tecnologia um tanto curiosa a primeira vista. Estou assumindo que você já ouviu falar sobre a tecnologia, mas ainda não colocou a mão na massa. Nesse artigo iremos construir uma API bem simples, usando Express e JSON Server, e você só vair precisar do Node.js instalado para rodar o projeto. Então vamos lá!

Todo o código está disponível em meu GitHub. Clone o repositório na sua máquina, e vamos ver como tudo isso funciona. Primeiramente vamos abrir o package.json, e ver o que temos como dependência.

As dependências do projeto no arquivo package.json

Axios é o nosso cliente HTTP, express-graphql o nosso middleware da rota “/graphql”, json-server nossa base de dados mockada e por fim, usaremos o nodemon para automatizar a execução do nosso server.js

No arquivo server.js, registramos um middleware para a rota “/graphql” da nossa API. Esse módulo espera um objeto do tipo GraphQLSchema, que estamos exportando no schema.js.

Importando o cliente HTTP, e alguns tipos pré-definidos do GraphQL

Logo abaixo, uso esses tipos para definir o tipo CustomerType. Quando criamos um tipo no GraphQL, definimos as propriedades name, description e fields, que recebe uma função que define os campos que nosso tipo irá possuir.

CustomerType, um tipo que representa um cliente genérico

Veja que a propriedade purchases é diferente das demais, sendo uma GraphQLList de PurchaseType, um outro tipo que iremos definir. Interessante! Essa é uma das maneiras que podemos relacionar nossos dados na API. Agora veremos o PurchaseType.

PurchaseType, um tipo que representa uma compra genérica

Esse tipo é até mais simples que nosso CustomerType. Ele tem um id, um product_id e um total_spent. Perceba que aqui, ao invés de termos um product_id, poderíamos definir um ProductType, por exemplo, e começar a criar outros relacionamentos.

Agora vamos ver o RootQuery, um outro objeto em que definimos quais campos nossa rota “/graphql”. Criei um campo customer que retorna um único objeto CustomerType, de acordo com o id da consulta.

A function resolve é que de fato busca os dados no nosso JSON Server

Também há um campo customers, que retorna uma GraphQLList com todos os objetos CustomerType existentes na nossa “base de dados” rodando no JSON Server.

Similar a anterior, essa resolve faz um GET no rota /customers do nosso JSON Server

Ok, já podemos consultar dois campos da nossa API, vamos testar? Acesse a página http://localhost:4000/graphql. Nessa URL temos a GraphiQL, uma interface gráfica que serve como sand-box brincarmos um pouco.

GraphiQL, uma sand-box que usamos para brincar na nossa API

Escrevemos as consultas no lado esquerdo, e com Ctrl+Enter vemos o resultado no lado direito. Simples. Nessa consulta, estou buscando pelo customer de id = “1”. Logo em seguida eu digo eu seleciono exatamente que campos eu quero na resposta. Entender a importância desse fator é essencial.

Pronto! Temos uma API básica para brincarmos. Ainda no arquivo schema.js, há exemplos de operações CRUD nesses dois tipos definidos. No final do arquivo README.md você pode ver outros tipos de consultas, envolvendo aquele relacionamento entre Customers e Purchases mencionado anteriormente.

Nesse arquivo também como rodar o projeto em sua máquina, caso você tenha experiência com Node.js e NPM.

Uma busca das compras do customer de id 1 e suas purchases.

Caso você tenha se interessado por essa tecnologia, você pode encontrar nesse artigo publicado na freeCodeCamp, um conteúdo bem completo, explicando todo o ecossitema GraphQL e seus diversos conceitos.

Também recomendo a série de vídeos sobre GraphQL no canal funfun function do grande Mattias Petter Johansson. Aqui vai o primeiro vídeo da série:

Série de vídeos introdutórios sobre GraphQL

Caso tenha gostado, me siga aqui no Medium, e também siga o Equals Lab para receber bastante conteúdo legal. Até a próxima!

--

--