GraphQL e REST quais as diferenças?

John Calistro
iDEXO Developers
Published in
4 min readJun 14, 2018

REST já está sendo utilizado a muito tempo, todos sabemos como funciona, GraphQL ainda é uma novidade para muitos, neste artigo irei tentar comparar as duas especificações.

GraphQL é uma especificação de busca declarativa de dados e linguagem de buscas para APIs que foi criada pelo Facebook em 2012 para suas aplicações móveis. A intenção é disponibilizar uma interface comum entre o cliente e o servidor para buscar e manipular dados. GraphQL se tornou open source em 2015.

Quanto as similaridades, a parte mais obvia é que ambas são especificações para construir e consumir APIs e ambas podem ser usadas em HTTP, porem GraphQL é agnóstica quanto a protocolo.

Busca de dados

A principal inovação que o GraphQl introduziu foi a busca de dados, em uma chamada REST para buscar um dado do servidor temos que fazer requisições para múltiplos endpoints, com o GraphQL temos somente um endpoint no qual acessamos os dados no servidor, com uma requisição simples nós podemos obter um objeto e os seus objetos relacionados.

Vamos fazer um comparativo entre REST e GraphQL com o seguinte exemplo: Queremos buscar as informações de um autor específico, os posts que ele publicou e os comentários de cada um dos posts.

Com REST teríamos que ter um endpoint /authors/:id para buscar pelo autor, um endpoint /authors/:id/posts para buscar os posts deste autor e um endpoint /authors/:id/posts/:id/comments para pegar os comentários dos posts.

Temos que fazer três endpoint diferentes para resolver nosso exemplo acima.

Já com o GraphQL, precisamos fazer a requisição para somente um endpoint /graphql com a seguinte chamada:

{
author {
name
posts {
title
comments {
comment
}
}
}
}

E teremos a seguinte resposta:

{
"data": {
"author": {
"name": "John Calistro",
"posts": [
{
"title": "REST x GraphQL",
"comments": [
{
"comment": "Agora entendi!"
}
]
},
{
"title": "O que é deep linking?",
"comments": [
{
"comment": "Growth Hacking na veia."
}
]
}
]
}
}
}

No exemplo acima, na implementação REST perceba que temos três endpoints para buscar os dados, portanto três diferentes chamadas ao servidor. Na implementação GraphQL por outro lado nós temos somente uma chamada ao servidor. GraphQL reduz as chamadas permitindo buscar ou trazer todos os dados que necessitamos em uma chamada única.

É fácil trazer mais dados do que você necessita com o REST, isso porque cada endpoint em uma API REST tem uma estrutura de dados fixa, o que faz com que retorne sempre tudo o que tiver na estrutura. Na maioria do tempo nós usamos somente os dados necessários, ignorando o excedente, também, no caso do REST, é fácil trazer menos dados do que os que necessitamos, fazendo com que tenhamos que solicitar os adicionais por meio de endpoints extras.

Com GraphQl isso não acontece porque ele tem uma especificação declarativa de busca de dados e uma linguagem de busca, nós buscamos somente o que necessitamos do servidor construindo nossa query para somente incluir o que necessitamos. A chamada abaixo irá trazer apenas o nome do autor, nada mais, nada menos:

{
author {
name
}
}


{
"data": {
"author": {
"name": "Chimezie Enyinnaya"
}
}
}

Erros

Tratamento de erro no Rest é bem direto, simplesmente checamos o cabeçalho HTTP para pegar o status da resposta. Dependendo do código do status que recebemos ( 404, 503, 500, etc ), podemos facilmente dizer qual o erro e como tentar resolvê-lo. GraphQl por outro lado, quando utilizado com HTTP sempre recebe status 200 OK. Quando um erro ocorre no processamento de chamada do GraphQL uma mensagem de erro completa é enviada para o cliente, abaixo está um exemplo de uma mensagem de erro típica do GraphQL:

{
"errors": [
{
"message": "Field \"hello\" must not have a selection since type \"String\" has no subfields.",
"locations": [
{
"line": 2,
"column": 9
}
]
}
]
}

Caching

HTTP já implementa caching e REST é implementado usando HTTP, o cliente pode usar HTTP caching para evitar chamadas repetidas. GraphQL não tem mecanismo de caching, deixando o cliente com a responsabilidade de fazer o caching.

Versionamento

Normalmente quando consumimos REST APIs de terceiros nós vemos algo como v1, v2, v3, etc, que indica a versão da API REST que estamos usando, trazendo uma redundância de código e manutenção de código mais difícil. Com GraphQL não há necessidade de versionamento, já que podemos facilmente marcar campos como depreciados e os campos serão excluidos da resposta enviada pelo servidor.

Clientes

  • Relay: Cliente GraphQL desenvolvido pelo Facebook, otimizado para performance, disponível somente na WEB.
  • Apollo Client: Projeto da comunidade para construir um cliente GraphQL poderoso, flexível e pronto para produção, compatível com as maiores plataformas de desenvolvimento, compatível com vários frameworks de frontend (React, Angular e Vue) e plataformas (iOS, Android).

Servidores

  • GraphQL.js: A implementação de referência da especificação GraphQL, criada para rodar GraphQL em um ambiente Node.js.
  • Graphql-tools: Um pacote que possibilita construir um schema GraphQL.js pronto para produção usando a linguagem de schema GraphQL ao invés de usar os constructors GraphQL.js diretamente. Isso possibilita suporte adicional para resolvers, unions, interfaces, scalares customizadas, modularizar seu schema, e mais.
  • Apollo-server: Uma biblioteca GraphQL para servidor pronta para produção escrita em Node.js que suporta Express, Connect, Hapi, Koa, e outros servidores Node HTTP populares, com funcionalidades internas tais como buscas persistentes, batching e muito mais. Apollo Server funciona com qualquer GraphQL cliente, por exemplo Apollo, Relay e outros.

Uma lista completa com referencias de como implementar GraphQL em varias linguagens pode ser encontrada aqui http://graphql.org/code.

--

--