Sitemap

GRAPHQL

4 min readSep 2, 2021

--

Flexibilidade nas informações dos nossos sistemas.

O GraphQL tem como objetivo deixar o desenvolvimento de APis mais simples, ele entra como uma alterativa para à arquitetura Rest, onde pode ser extraido os dados de fontes distintas em uma mesma requisição de API.

Muitos sistemas usam abordagens com ambos os métodos, assim pode se usar o que for preciso no melhor cenário, o GraphQL pode conversar diretamente com a base de dados e devolver os dados, tendo uma cada de rest no meio. Na imagem abaixo podemos ver um cenário onde temos implementadas ambas.

É dado o nome de schema para a estrutura usada pelo GraphQL para disponibilizar os dados para os usuários e cada um dos dados deve ter um type definido. Podemos pensar em um schema como uma interface, que criamos na orientação a objetos, onde será a maior dela, que iremos declarar todos os nossos campos e declarar seus tipos.

type User{
id: ID
name: String!
email: String!
password: String!
}

Para consumir os dados de uma aplicação temos disponível dois métodos Query e Mutation.

Query:

Usado quando queremos realizar apenas consultas nos dados.

type Query {
users: [User]!
findUserByEmail(email: String!): User!
}

Acima temos duas querys definidas, a primeira que lista todos os usuários e a segunda que procura especificamente.

Mutation:

Usado quando precisamos realizar algum tipo de manipulação nos dados(criação,alteração,remoção).

type Mutation { 
createUser(name:String, email: String, password: String): User }

Temos a mutation que é responsável pela criação de um usuário. Exemplo prático usando nestjs:

mutation{    createUser(       data: {           email: "gabriella@gmail.com",           firstName: "Gabriella",           lastName: "Staniecki",           phone: "46465"       }
){
id }}

Dependendo da linguagem de programação usada toda essa parte do schema é criada automaticamente e o desenvolvedor precisa se preocupar apenas com a codificação. Deixo aqui a documentação para implementar o GraphQL com nestjs.

Resolvers:

No nossa arquivo de schema só definimos nossas querys e os dados, mas precisamos de um modo para executá-los. O resolver será o responsável por realizar a execução de cada query ou mutation que declaramos no schema, podemos ter um arquivo de resolver diferente para cada base de dados.

Get Gabriella Selbach’s stories in your inbox

Join Medium for free to get updates from this writer.

Como exemplo de um resolver para nossa query de listar os usuários segue o exemplo usando nestjs:

@Query(() => [User])
async users(): Promise<User[]> {
const users = await this.userService.findAll();return users;}

Então aqui basicamente o que o resolver está fazendo é chamar o método do service que busca os usuários.

Subscription:

Usado para realtime, toda vez que eu quiser saber em tempo real uma alteração que teve no servidor, em uma aplicação normal teria que ser usado sockets para fazer esse monitoramento, aqui temos integrado essa funcionalidade.

Rotas:

Em uma api rest normal teremos uma rota para cada ação que queremos realizar.

GET /users
POST /users
PUT /users/:id
DELETE /users/:id

No graphql teremos apenas um endpoint que geralmente é

POST /graphql

Esse endpoint espera receber uma estrutura de objeto

{   query {
users()
}
mutation {
createUser( Args ...
){ // Campos de retorno caso queira id
name
email
}
}
}

Podemos notar no endpoint mostrado acima que estamos no mesmo lugar realizando um busca de informações e uma inserção, o que em um REST precisaríamos executar dois endpoints separados.

No cenário que estamos será o cliente que irá informar para o servidor que dados ele precisa e não o contrário.

Quando estamos trabalhando com uma API REST normal, para testa-lá precisamos usar uma plataforma para testar, as mais comuns são Insomnia e Postman. O Graphql já tem integrado essa plataforma para consumir nossa API, chamamos ela de Playground. Para usar basta, você realizar a instalação padrão e junto instalar o Apollo-Server.

Como exemplo de instalação usando nestjs teremos:

npm i @nestjs/graphql graphql apollo-server-express

Para entrar no playground você só precisa acessar no seu navegador:

http://localhost:{PORTA}/graphql

A {PORTA} é a que está rodando seu servidor. Baixo deixo um exemplo do playground, aqui estamos usando o mutation createUser:

Press enter or click to view image in full size

Vantagens:

  • A aplicação chega no usuário final muito mais rápida, só entregamos os dados que são realmente necessários;
  • Existe menos falhas entre cliente-servidor;
  • Uma API pode evoluir usando GraphQL, e o que já funcionava com rest seguirá rodando;

Desvantagens:

  • A curva de aprendizagem se comparada com REST não é tão simples;
  • Armazenar informações em cache não é tão trivial;
  • toda consulta retorna um status 200;

Quando usar?

Principalmente quando temos aplicações que lida com dados que precisam ser processados rapidamente, que tem uma alta taxa de transferência, é preciso lidar com múltiplos banco de dados. O GraphQL surgiu no facebook, como uma forma de otimizar os muitos dados que precisavam ser consumidos de todos os usuários, podemos entender como uma estrutura parecida com um banco de dados de grafo.

--

--