GraphQL Vs. REST APIs
Published: 2022-12-26 17:39:31

> A principal diferença entre as APIs GraphQL e REST é que GraphQL é uma especificação, uma linguagem de consulta, enquanto REST é um conceito arquitetônico para software baseado em rede.

O GraphQL está ganhando força como sucessor das APIs REST. No entanto, nem sempre é um “substituto”, e tomar a decisão de optar pelo GraphQL envolve várias considerações.

Tradicionalmente e quando usado “fora da caixa”, o REST teve limitações como várias solicitações de rede e dados de busca excessiva. Para superar isso, o Facebook desenvolveu o GraphQL como uma linguagem de consulta e manipulação de dados de código aberto para APIs.

GraphQL é uma sintaxe para solicitar dados e permite que você especifique exatamente o que você precisa.

Dependendo de seus casos de uso, você precisará escolher entre GraphQL ou REST API, ou uma combinação de ambos. Para tomar uma decisão mais informada, vamos dar uma olhada no REST e no GraphQL e entender alguns dos motivos para escolher o GraphQL.

## API REST

#### O que é uma API REST?

REST (Representational State Transfer) é um estilo de arquitetura que obedece a um conjunto de restrições ao desenvolver serviço web. Foi introduzido como sucessor das APIs SOAP.REST, ou RESTful APS, são APIs Web Service que seguem padrões REST. Ao contrário do SOAP, uma API REST não é restrita a um formato XML e pode retornar vários formatos de dados, dependendo do que for necessário. Os formatos de dados suportados pela API REST incluem JSON, XML e YAML.

Quando um client chama APIs REST, o servidor transfere os recursos em uma representação padronizada. Eles funcionam retornando informações sobre a fonte solicitada - e são traduzidas em um formato interpretável.

![Imagem representado o Frontend](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7dooy0fxykm2btjqpxs8.png)

As APIs REST permitem modificações e adições do lado do cliente para o servidor, traçando certos paralelos com **GraphQL Mutations**, sobre as quais abordaremos mais adiante.

#### Trabalhando com APIs REST

Uma solicitação REST é composta de **endpoint**, **HTTP method**, **Header** e **Body**.

Um endpoint contém uma URI (Uniform Resource Identifier) que ajuda a identificar o recurso online.

Um método HTTP descreve o tipo de solicitação que é enviada ao servidor. Eles são:

- GET: lê uma representação de uma fonte especificada.
- POST:cria uma nova origem especificada.
- PUT: atualiza/substitui cada recurso em uma coleção.
- PATCH: modifica uma fonte.
- DELETE: exclui uma fonte.

Ao trabalhar com dados, uma API RESTful usa métodos HTTP para executar operações CRUD (Criar, Ler, Atualizar e Excluir).

Os cabeçalhos fornecem informações a clientes e servidores para fins de armazenamento em cache, teste AB, autenticação e muito mais.

O corpo contém informações que um cliente deseja enviar para um servidor, como a carga útil da solicitação.

## APIs GraphQL

#### O que é GraphQL?

GraphQL é uma linguagem de consulta e manipulação de dados de código aberto para APIs e um tempo de execução para atender consultas com dados existentes. Mantido e desenvolvido por meio da [GraphQL Foundation](https://graphql.org/foundation/), o GraphQL teve uma adoção incrível em uma variedade de verticais e casos de uso como organizações como o Twitter, Expedia, Spotify e Hygraph, para citar alguns.

![Imagem representando o GraphQL](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9rvp3foczu1s2unfbqn1.png)

#### Vantagens das APIs GraphQL

Vamos cobrir algumas das vantagens básicas que ajudam o GraphQL a se destacar.

#### Busca de dados

Uma das limitações mais comuns do REST, é a busca excessiva e insuficiente. Isso acontece porque a única maneira de um cliente baixar dados é acessando endpoints que retornam conjuntos de dados fixos. É muito difícil projetar a API de forma que seja capaz de fornecer aos clientes suas necessidades exatas de dados.

Overfetching significa obter mais informações do que você precisa. Por exemplo, se o endpoint tiver dados sobre hambúrgueres disponíveis em um restaurante, você atingirá o endpoint `/burgers` e, em vez de obter apenas os nomes que lhe interessa, poderá obter tudo o que o endpoint tem a oferecer - incluindo preço, ingredientes, calorias, etc. Com o GraphQL, você simplesmente precisa ditar o que deseja em uma consulta:

```jsx
{
  burgers {
    name
  }
}
```
Sua resposta não incluirá nenhuma informação desnecessária que o endpoint possa fornecer, você obterá apenas um conjunto de dados previsível para trabalhar com base no que você solicitou.

#### Segurança de Schema e Tipo

O GraphQL usa um sistema fortemente tipado para definir os recursos de uma API. Rodos os tipos expostos em uma API, são escritos em um esquema usando **GraphQL Schema Definition Language (SDL)** e/ou code-first.

As equipes de front-end agora podem trabalhar com a API GraphQL sabendo que, se ocorrer alguma alteração da equipe de back-end no design das APIs, eles obterão esse feedback instantâneo ao consultálo no front-end.

Ferramentas populares como o gerador de código GraphQL, podem criar automaticamente todo o código para consultas e mutações diretamente de seus arquivos de consulta GraphQL na base de código. Isso acelera o desenvolvimento e evita erros na produção.

#### Desenvolvimento rápido de produtos

Um padrão comum com APIs REST é estruturar os endpoints de acordo com as visualizações que você tem dentro de sua aplicação, (exemplo `/menu`, `/prices`, `/images`, etc.). Isso é útil, pois permite que o cliente obtenha todas as informações necessárias para uma exibição específica simplesmente acessando o endpoint correspondente. 

A desvantagem dessa abordagem é que ela não permite iterações rápidas. A cada alteração feita na interface do usuário, existe o risco de haver mais (ou menos) dados necessários do que antes.

Consequentemente, o back-end também precisa ser ajustado para levar em consideração essas novas necessidades de dados, sendo contraproducente e retardando o processo de desenvolvimento do produto.

Com a natureza flexível do GraphQL, as alterações no lado do cliente podem ser feitas sem nenhum trabalho extra no servidor. Como os clientes podem especificar seus requisitos de dados exatos, nenhum ajuste de back-end precisa ser feito quando o design e os dados precisam mudar no front-end.

#### Costura de Schema

Uma grande diferenciação, é a capacidade de costurar esquemas. O GraphQL pode combinar vários esquemas em um único esquema, para tornálos acessível ao cliente. Por exemplo, mesclar os esquemas de uma API de Hambúrgueres e uma API de Nutrição, obtendo os detalhes de um menu específico e os dados nutricionais do item em um único esquema, de diferentes fonrtes.

```jsx
{
  burgers(where: { name: "cheeseburger"})
  # from Menu endpoint
  name 
  description 
  price 
  # from Nutrition endpoint
  calories 
  carbohydrates  
  # from Restaurant endpoint
  inStock 
}
```

## GraphQL vs. REST

A principal diferença entre as APIs GraphQL e REST é que GraphQL é uma especificação, uma linguagem de consulta, enquanto REST é um conceito arquitetônico para software baseado em rede.

O GraphQL é ótimo para ser fortemente tipado e autodocumentado com base em tipos e descrições de esquema e integra-se com ferramentas geradoras de código para reduzir o tempo de desenvolvimento.

Ao pensar em uma das diferenciações mais conhecidas - as diferenças nas respostas esperadas para as consultas - em termos muito simples, podemos pensar em um processo de pedir hambúrgueres. Embora o meme do hambúrguer GraphQL já exista há algum tempo, o esclarecimento que ele fornece ainda simplifica a compreensão dos conceitos.

Imagine que você está entrando em uma lanchonete e pede um cheeseburguer. Independentemente de quantas vezes você pedir (chamando sua API RESTfull), você obtém todos os ingredientes desse cheeseburger duplo todas as vezes. Sempre terá a mesma forma e tamanho (o que é retornado em uma resposta RESTfull).

`https://api.com/cheeseburger/`

Com o GraphQL, você pode "fazer do seu jeito" descrevendo exatamente como deseja que o cheeseburguer seja. Agora você pode colocar seu cheeseburger (resposta) com um pãozinho por cima, seguido de um hambúrguer, pickes, cebola e queijo (a menos que você seja vegano), sem o pãozinho embaixo.

```jsx
query getCheeseburger ($vegan: Boolean) {
  cheeseburger {
    bun
    patty
    pickle
    onion
    cheese @skip(if: $vegan)
  }
}
```
Sua resposta do GraphQL é moldada e dimensionada para ser exatamente como você a descreve. Sua resposta é exatamente o que você queria ou questionou - nem mais, nem menos, nem diferente.

![Imagem com dois hamburgueres simbolizando GraphQL e REST](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kwgf44vjp3ljsn6uajs4.png)

Uma API REST é um "conceito de arquitetura" para software baseado em rede. O GraphQL, por outro lado, é uma linguagem de consulta e um conjunto de ferramentas que operam em um único endpoint. Além disso, nos últimos anos, REST tem sido usado para criar novas APIs, enquanto o foco do GraphQL tem sido otimizar o desempenho e a flexibilidade.

Ao usar REST, você provavelmente obterá uma resposta de "conjuntos de dados" completos. Se você quiser solicitar informações de xobjetos, precisará executar xsolicitações de API REST. Se você estiver solicitando informações sobre um produto para um site de menu, suas solicitações podem ser estruturadas desta forma:

- Solicitação de nomes de hambúrguer, descrições, ingredientes etc. em uma solicitação
- Solicitação de preços referentes a esse menu em outra solicitação
- Solicitação de imagens de outro conjunto de dados
- ... e assim por diante

Por outro lado, se você quiser coletar algumas informações de um endpoint específico, não poderá limitar os campos que a API REST retorna ; você sempre obterá um conjunto de dados completo - ou overfetching - ao usar APIs REST prontas para uso sem configurações adicionais.

O GraphQL usa sua linguagem de consulta para adaptar a solicitação exatamente ao que você precisa, desde vários objetos até campos específicos dentro de cada entidade. O GraphQL usaria o endpoint 
x e pode fazer muito com essas informações, mas você precisa dizer o que deseja primeiro.

Usando o mesmo exemplo, a solicitação seria simplesmente obter `menuItem`, `menuIngredients`, `menuImagee` `menuPrice` do mesmo endpoint, dentro de uma solicitação e não mais. Todos os outros conteúdos dentro do banco de dados não seriam retornados, então o problema de overfetching não seria uma preocupação.

Muito semelhante à analogia do hambúrguer que destacamos antes - o REST fornece o cheeseburger que o restaurante tem no menu, mas o GraphQL permite que você modifique esse hambúrguer para obter exatamente quanto deseja.

Optar pelo GraphQL contra ou com REST é uma decisão altamente subjetiva, fortemente influenciada pelo caso de uso. É importante não considerar o GraphQL como uma alternativa ao REST, nem como um substituto. Para ajudar a simplificar essa decisão, aqui estão alguns diferenciais importantes:

### GraphQL:

- Uma linguagem de consulta para resolver problemas comuns ao integrar APIs

- Implantado em HTTP usando um único endpoint que fornece todos os recursos do serviço exposto

- Usa uma arquitetura orientada ao cliente

- Falta mecanismo de cache embutido

- Não é necessário versionamento de API

- Saída de resposta em JSON

- Oferece segurança de tipo e documentação gerada automaticamente

- Permite costura de esquema e busca remota de dados

### REST:

- Um estilo arquitetônico amplamente visto como um padrão convencional para projetar APIs

- Implantado em um conjunto de URLs onde cada um deles expõe um único recurso

- Usa uma arquitetura orientada a servidor

- Usa cache automaticamente

- Suporta várias versões de API
- Saída de resposta geralmente em XML, JSON e YAML

- Não oferece segurança de tipo ou documentação gerada automaticamente

- Simplificar o trabalho com vários endpoints requer middleware personalizado caro