Qual é a diferença entre GraphQL e REST?
GraphQL e REST são duas abordagens distintas para projetar API para troca de dados pela Internet. REST permite que as aplicações cliente troquem dados com um servidor usando verbos HTTP, que é o protocolo de comunicação padrão da Internet. Por outro lado, GraphQL é uma linguagem de consulta de API que define as especificações de como uma aplicação cliente deve solicitar dados de um servidor remoto. Você pode usar GraphQL em suas chamadas de API sem depender da aplicação do lado do servidor para definir a solicitação. Tanto GraphQL quanto REST são tecnologias poderosas por trás da maioria das nossas aplicações modernas.
Quais são as semelhanças entre o GraphQL e o REST?
Tanto GraphQL quanto REST são estilos populares de arquitetura de API que permitem a troca de dados entre diferentes serviços ou aplicações em um modelo cliente-servidor.
As APIs facilitam o acesso a dados e operações de dados como estas:
- Um cliente envia uma solicitação de API para um endpoint ou vários endpoints em um servidor
- O servidor fornece uma resposta que contém dados, status dos dados ou códigos de erro
REST e GraphQL permitem criar, modificar, atualizar e excluir dados em uma aplicação, serviço ou módulo separado via API. As APIs desenvolvidas com REST são conhecidas como APIs RESTful ou APIs REST. Aquelas desenvolvidas com GraphQL são simplesmente APIs GraphQL.
As equipes de front-end e back-end usam essas arquiteturas de API para criar aplicações modulares e acessíveis. O uso de uma arquitetura de API ajuda a manter os sistemas seguros, modulares e escaláveis. Também os torna mais eficientes e fáceis de integrar com outros sistemas.
A seguir, abordaremos algumas outras semelhanças entre GraphQL e REST.
Arquitetura
Tanto REST quanto GraphQL implementam vários princípios arquitetônicos de API comuns. Por exemplo, aqui estão os princípios que eles compartilham:
- Ambos não têm estado, portanto, o servidor não salva o histórico de respostas entre as solicitações
- Ambos usam um modelo cliente-servidor, portanto, solicitações de um único cliente resultam em respostas de um único servidor
- Ambos são baseados em HTTP, pois HTTP é o protocolo de comunicação subjacente
Projeto baseado em recursos
Tanto REST quanto GraphQL projetam o intercâmbio de dados em torno de recursos. Um recurso se refere a qualquer dado ou objeto que o cliente possa acessar e manipular por meio da API. Cada recurso tem seu próprio identificador exclusivo (URI) e um conjunto de operações (métodos HTTP) que o cliente pode realizar nele.
Por exemplo, considere uma API de mídia social na qual os usuários criam e gerenciam publicações. Em uma API baseada em recursos, uma publicação seria um recurso. Ela tem seu próprio identificador exclusivo, por exemplo, /posts/1234. E tem um conjunto de operações, como GET, para recuperar a publicação em REST, ou query, para recuperar a publicação em GraphQL.
Data Exchange
Tanto REST quanto GraphQL oferecem suporte a formatos de dados semelhantes.
JSON é o formato de troca de dados mais popular, que todas as linguagens, plataformas e sistemas entendem. O servidor retorna dados JSON para o cliente. Outros formatos de dados estão disponíveis, mas são menos usados, incluindo XML e HTML.
Da mesma forma, REST e GraphQL oferecem suporte ao armazenamento em cache. Assim, clientes e servidores podem armazenar em cache os dados acessados com frequência para aumentar a velocidade da comunicação.
Neutralidade de linguagem e banco de dados
As APIs GraphQL e REST funcionam com qualquer estrutura de banco de dados e qualquer linguagem de programação, tanto do lado do cliente quanto do servidor. Isso as torna altamente interoperáveis com qualquer aplicação.
Quais limitações de REST o GraphQL tenta superar?
GraphQL surgiu em 2012, como uma resposta à necessidade de velocidade nas plataformas emergentes de mídia social. Os desenvolvedores descobriram que as arquiteturas de API existentes, como REST, eram muito longas e estruturadas para produzir feeds de notícias com eficiência.
A seguir, a abordamos alguns dos desafios que eles enfrentaram.
Troca de dados de estrutura fixa
A API REST exige que as solicitações do cliente sigam uma estrutura fixa para receber um recurso. Essa estrutura rígida é fácil de usar, mas nem sempre é o meio mais eficiente de trocar exatamente os dados necessários.
Excesso e falta de busca
As APIs REST sempre retornam um conjunto de dados inteiro. Por exemplo, a partir de um objeto person na API REST, você receberia o nome, a data de nascimento, o endereço e o número de telefone da pessoa. Você obteria todos esses dados mesmo se precisasse apenas de um número de telefone.
Da mesma forma, se quisesse saber o número de telefone e a última compra alguém, precisaria de várias solicitações da API REST. A URL /person retornaria o número de telefone, e a URL /purchase retornaria o histórico de compras.
Os desenvolvedores de mídias sociais precisaram escrever uma grande quantidade de código apenas para processar solicitações de API, o que afetou a performance e a experiência do usuário.
O GraphQL surgiu como uma solução baseada em consultas. As consultas podem retornar os dados exatos em apenas uma troca de solicitações e respostas de API.
Principais diferenças: GraphQL versus REST
Uma API REST é um conceito arquitetônico para comunicação de aplicações. Por outro lado, GraphQL é uma especificação, uma linguagem de consulta de API e um conjunto de ferramentas. GraphQL opera em um único endpoint usando HTTP.
Além disso, o desenvolvimento de REST está mais focado na criação de novas APIs. Enquanto isso, o foco do GraphQL está na performance e na flexibilidade da API.
Apresentamos mais algumas diferenças abaixo.
Solicitação do lado do cliente
Veja o que uma solicitação REST usa para funcionar:
- Verbos HTTP que determinam a ação
- Uma URL que identifica o recurso no qual acionar o verbo HTTP
- Parâmetros e valores a serem analisados para criar ou modificar um objeto em um recurso existente do lado do servidor
Por exemplo, você usa GET para obter dados somente para leitura de um recurso, POST para adicionar uma nova entrada de recurso ou PUT para atualizar um recurso.
Por outro lado, aqui está o que as solicitações do GraphQL usam:
- Consulta para obter dados somente leitura
- Mutação para modificar dados
- Assinatura para receber atualizações de dados baseadas em eventos ou streaming
Um formato de dados descreve como o servidor deve retornar os dados, incluindo objetos e campos que correspondam ao esquema do lado do servidor. Também é possível inserir novos dados. Internamente, o GraphQL envia cada solicitação do cliente como uma solicitação HTTP POST.
Dados retornados ao cliente
Na arquitetura REST, os dados são retornados ao cliente a partir do servidor na estrutura completa de recursos especificada pelo servidor. Os exemplos a seguir mostram dados retornados em REST e GraphQL.
Exemplo de dados retornados em REST
Em REST, GET /posts retorna o seguinte:
[
{
"id": 1,
"título": "Primeira publicação",
"conteúdo": "Este é o conteúdo da primeira publicação."
},
{
"id": 2,
"Segunda publicação",
"conteúdo": "Este é o conteúdo da segunda publicação."
},
{
"id": 3,
"título": "Terceira publicação",
"conteúdo": "Este é o conteúdo da terceira publicação."
}
)
Exemplo de dados retornados no GraphQL
Ao usar o GraphQL, somente os dados especificados na estrutura fornecida pelo cliente são retornados.
GET /graphql?query{post(id: 1) {id title content}} retorna apenas a primeira publicação:
{
"dados": {
"publicações": [
{
"id": "1",
"título": "Primeira publicação",
"conteúdo": "Este é o conteúdo da primeira publicação."
},
]}}
Esquema do lado do servidor
GraphQL usa um esquema do lado do servidor para definir dados e serviços de dados, o que difere de uma API REST.
O esquema, escrito na linguagem de definição de esquema GraphQL, inclui detalhes como estes:
- Tipos de objeto e campo que pertencem a cada objeto
- Funções de resolução do lado do servidor que definem uma operação para cada campo
O esquema define explicitamente os tipos para descrever todos os dados disponíveis no sistema e como os clientes podem acessar ou modificar esses dados.
Por outro lado, as APIs REST não exigem um esquema do lado do servidor. Mas é possível defini-lo opcionalmente para projeto de API, documentação e desenvolvimento de clientes eficientes.
Controle de versão
Conforme as APIs evoluem, suas estruturas e operações de dados podem mudar. Para clientes sem o conhecimento dessas mudanças, isso pode interromper sistemas ou introduzir erros desconhecidos.
As APIs REST geralmente incluem versionamento na URL para resolver esse problema, como https://example.com/api/v1/person/12341. No entanto, o controle de versão não é obrigatório e pode levar a erros.
O GraphQL requer compatibilidade com versões anteriores da API. Portanto, os campos excluídos retornam uma mensagem de erro, ou aqueles com uma tag obsoleta retornam um aviso.
Tratamento de erros
GraphQL é uma arquitetura de API de tipagem forte, o que significa que exige uma descrição detalhada dos dados, de sua estrutura e das operações de dados no esquema. Devido ao nível de detalhes no esquema, o sistema pode identificar automaticamente os erros de solicitação e fornecer mensagens de erro úteis.
As APIs REST são de tipagem fraca, e é preciso incorporar o tratamento de erros no código circundante. Por exemplo, se uma solicitação PUT analisar um valor numérico como texto, em vez de número inteiro, o sistema não identificará o erro automaticamente.
Quando usar GraphQL versus REST
É possível usar as APIs GraphQL e REST de forma intercambiável. No entanto, existem alguns casos de uso em que uma ou outra é mais adequado.
Por exemplo, GraphQL provavelmente é a melhor opção nestes casos:
- Você tem largura de banda limitada e deseja minimizar o número de solicitações e respostas
- Você tem várias fontes de dados e deseja combiná-las em um único endpoint
- Você tem solicitações de clientes que variam significativamente e espera respostas muito diferentes
Por outro lado, REST é provavelmente a melhor escolha nestes casos:
- Você tem aplicações menores com dados menos complexos
- Você tem dados e operações que todos os clientes usam da mesma forma
- Você não precisa de consultas complexas de dados
Também é possível criar uma única aplicação com APIs GraphQL e APIs REST para diferentes áreas de funcionalidade.
Como usar o GraphQL e o REST na mesma API
É possível atualizar uma API RESTful para uma API GraphQL sem realizar uma reescrita completa.
Aqui está um resumo do processo:
- Entenda o modelo de dados da API RESTful. Para fazer isso, examine a forma dos dados em cada recurso de URL.
- Escreva o esquema GraphQL a partir do modelo de dados.
- Determine quais operações os clientes realizam nos dados e inclua-as no esquema.
- Crie uma função de resolução no código do lado do servidor para cada campo no esquema.
- Crie um servidor GraphQL com as resoluções e o esquema.
Depois disso, os clientes podem se comunicar com a API usando o GraphQL ou o REST.
Resumo das diferenças: REST versus GraphQL
REST |
GraphQL |
|
O que é isso? |
REST é um conjunto de regras que define a troca estruturada de dados entre um cliente e um servidor. |
GraphQL é uma linguagem de consulta, estilo de arquitetura e conjunto de ferramentas para criar e manipular APIs. |
Mais adequada para |
REST é bom para fontes de dados simples, em que os recursos são bem definidos. |
GraphQL é bom para fontes de dados grandes, complexas e inter-relacionadas. |
Acesso aos dados |
REST tem vários endpoints na forma de URLs para definir recursos. |
GraphQL tem um único endpoint de URL. |
Dados retornados |
REST retorna dados em uma estrutura fixa definida pelo servidor. |
GraphQL retorna dados em uma estrutura flexível definida pelo cliente. |
Como os dados são estruturados e definidos |
Os dados REST são de tipagem fraca. Portanto, o cliente deve decidir como interpretar os dados formatados quando eles são retornados. |
Os dados do GraphQL são de tipagem forte. Portanto, o cliente recebe dados em formatos predeterminados e mutuamente compreendidos. |
Verificação de erros |
Com o REST, o cliente deve verificar se os dados retornados são válidos. |
Com o GraphQL, as solicitações inválidas geralmente são rejeitadas pela estrutura do esquema. Isso resulta em uma mensagem de erro gerada automaticamente. |
Como a AWS oferece suporte aos requisitos de GraphQL e REST?
A Amazon Web Services (AWS) ajuda a criar e servir APIs gerenciadas melhores.
O AWS AppSync cria APIs GraphQL e publish-subscribe (pub/sub) com tecnologia sem servidor. Elas simplificam o desenvolvimento de aplicações por meio de um único endpoint para consultar, atualizar ou publicar dados com segurança.
Com o AWS AppSync, é possível criar APIs que permitem aos clientes:
- Interagir com várias fontes de dados (SQL, NoSQL, dados de pesquisa, endpoints REST e microsserviços) com uma única chamada de rede
- Sincronizar dados automaticamente entre aplicações móveis e Web e a nuvem
- Transmitir dados do back-end para e entre clientes conectados
- Acessar dados da Internet das Coisas (IoT) para criar painéis em tempo real em uma aplicação móvel ou Web
De forma semelhante, o Amazon API Gateway é um serviço gerenciado que permite criar, publicar, manter, monitorar e proteger APIs em qualquer escala com facilidade.
Aqui estão algumas maneiras com as quais você pode se beneficiar do uso do API Gateway:
- Fornecer aos usuários performance de alta velocidade para solicitações e respostas de API
- Autorizar o acesso às suas APIs
- Executar várias versões da mesma API simultaneamente para iterar, testar e lançar rapidamente novas versões
- Monitorar métricas de performance e informações sobre chamadas de API, latência de dados e taxas de erro
Comece a usar o GraphQL e o REST na AWS criando uma conta hoje mesmo.