• Home

    Escolha seu Plano

    Carreiras Alura

    Evolua com profundidade técnica, direção clara e aplicação prática.

    Jornadas guiadas do básico ao avançado com checkpoints práticos, desenhadas para quem busca profundidade e protagonismo técnico.

    Iniciante

    Comece do zero com uma trilha clara e progressiva.

    Fundamentos práticos para dar os primeiros passos com segurança e construir uma base sólida.

    Intermediário

    Continue sua evolução com cursos que conectam fundamentos, ferramentas e prática profissional. Ganhe autonomia, e avance para projetos mais completos.

    Avançado

    Aprofunde temas técnicos e estratégicos para enfrentar desafios mais complexos. Explore boas práticas, arquitetura, performance com visão profissional.

    Cursos

    Ver mais cursos de Back-end
    • Pensamento computacional: fundamentos da computação e lógica de programação
    • Lógica de programação: mergulhe em programação com JavaScript
    • DDD: fundamentos do design orientado a domínio
    • ASP.NET: autenticação e autorização em APIs e aplicações web
    • Microsserviços: migração de monólitos e modularização

    Cursos

    Ver mais cursos de Dados
    • Python para Dados: primeiros passos
    • Excel: domine o editor de planilhas
    • Engenharia de Dados: Orquestração de Pipelines com Apache Airflow
    • Power BI Desktop: construindo meu primeiro dashboard
    • Governança e Arquitetura de Dados

    Cursos

    Ver mais cursos de Inteligência Artificial
    • IA: Explorando o Potencial da Inteligência Artificial Generativa
    • Engenharia de Prompt: Criando Prompts Eficazes para IA Generativa
    • Claude para Análise de Dados: prompts, integrações e automações
    • Agno: criando agentes e sistemas multiagente
    • Engenharia de software na era da IA: segurança de aplicações com agentes, MCPs e código gerado por IA

    Cursos

    Ver mais cursos de Front-end
    • HTML e CSS: ambiente, estrutura e estilo
    • React: realizando testes avançados com Jest e Testing Library
    • React: integrando TypeScript em projetos
    • JavaScript: aprendendo a programar
    • React: aplicando arquiteturas de Micro frontends

    Cursos

    Ver mais cursos de DevOps
    • Sistema Operacional Linux: fundamentos e administração prática
    • Containers e Docker: empacotamento, isolamento e gestão
    • Redes: dos conceitos iniciais à criação de uma intranet
    • Linux: gerenciando diretórios, arquivos, permissões e processos
    • Cibersegurança: Fundamentos e práticas integradas

    Cursos

    Ver mais cursos de UX & Design
    • UX Research: mapeando a experiência da pessoa usuária
    • UX/UI Design: Entregando produtos digitais com IA
    • UI Design: Prototipação e animações interativas
    • Figma: Conhecendo o programa
    • Product Design: métricas e ciclo de vida do produto

    Cursos

    Ver mais cursos de Gestão & Negócios
    • Canva: Criação de landing pages e e-mail marketing
    • Agilidade: como ela pode ajudar a criar um time de alta performance
    • Google Analytics 4: Extrair insights e configurar eventos
    • Management 3.0: gerencie o ambiente, não as pessoas
    • Automação de processos com n8n: Inteligência de dados para Marketing

    Cursos

    Ver mais cursos de Mobile
    • React Native: Estilização e Layouts com Flexbox e StyleSheet
    • Flutter: Graphql e suporte offline
    • Android com Gemini: Trabalhando com textos e imagens na IA
    • Dart: trabalhando com orientação a objetos
    • React Native: Dominando Listas com FlatList e ScrollView

    Carreiras

    Ver mais carreiras
    • Especialista em IA
    • Engenharia de IA
    • Ai native software engineering
    • Arquitetura de Soluções com IA
    • AI Product Design
    • Engenharia de Machine Learning
    • Desenvolvimento Front-End React
    • Engenharia de Dados
    • Cloud Security
    • Social Media Marketing
    • Engenharia de Agentes de IA

    Cursos

    • Engenharia de Prompt: Prompts Eficazes para IA Generativa
    • Claude Code: Criando sua Primeira Aplicação
    • Python: Crie sua Primeira Aplicação
    • Git e GitHub: Compartilhando e Colaborando
    • N8N: Fluxos de Trabalho Avançados

    Cursos

    • Copilot Studio: Solução Multiagentes
    • Padrões de API HTTP e Modelagem de APIs
    • Python para Análise de Dados com SQL
    • Docker: Criando e Gerenciando Containers
    • Design com IA: Otimizando o Processo Criativo

    Cursos

    • Model Context Protocol (MCP)
    • Spec-Driven Development: Dev Assistido por Agentes
    • Arquitetura de Sistemas Distribuídos com Java
    • Governança de Modelos e Reprodutibilidade
    • Pentest: Vulnerabilidades em Aplicações Web

    Escolha seu Plano

    Skills & Go

    O Skills & Go é para Tech Leads, Product Managers, estrategistas e early adopters que transformam ideias em soluções de alto impacto. Em cursos ao vivo e 100% online, você domina a nova era da IA em tempo real.

    Aulas ao vivo

    Saiba mais
    • Agentic Engineering: orquestre múltiplos agentes com confiabilidade
    • Building AI Products: transforme ideias em produtos reais com IA
    • AI Data Strategy: transforme dados em decisões estratégicas com IA

    Escolha seu Plano

    Eventos Alura

    Nossos eventos são pensados para quem quer estar à frente das mudanças em tecnologia, IA e inovação. Em experiências presenciais, você acompanha tendências e se conecta com especialistas que estão moldando o futuro.

    Próximos eventos

    • Imersão Engenharia de Software: Dev na Era da IA
    • IA Conference
    • Alura Signals
  • Talent Lab
  • IA

    Escolha seu Plano

    Conteúdos gratuitos

    Explore conteúdos gratuitos para aprender tecnologia no seu ritmo. Encontre artigos com conteúdos técnicos para aprender na prática, notícias para acompanhar as principais tendências do mercado e o Alura Labs, com análises e reflexões de especialistas sobre tecnologia, IA e carreira.

    Conteúdos gratuitos

    • Artigos
    • Notícias
    • Alura Labs
  • Para Empresas
Ver planos
Links principais
  • Planos e Promoções
  • Links complementares do menu mobile
  • Talent lab
  • Inteligência Artificial
  • Pós Graduações
  • Para Empresas
  • Sobre a Alura
  • Grupo Alun
  • Entrar
    • Home
    • Carreiras
    • Skills & Go
    • Talent Lab
    • Inteligência Artificial
    • Pós Graduações
    • Artigos
    • Sobre a Alura
    • Grupo Alun
    LoginContato
    • LinkedIn
    • Instagram
    • YouTube
    1. Página inicial
    2. Back-end
    3. Todo o poder emana do cliente: explorando uma API GraphQL

    Todo o poder emana do cliente: explorando uma API GraphQL

    10 min10 minutos de leitura

    Alura

    10 min10 minutos de leitura

    Publicado: 12/09/2017

    1. Quais as limitações de uma API REST?
    2. Obtendo detalhes de um repositório
    3. Obtendo os pull requests de um repositório
    4. Resumindo
    5. Mais flexibilidade e eficiência com GraphQL
    6. Resumindo

    foto por Elena

    Esse tal de GraphQL tem causado bastante burburinho. Dizem que é uma alternativa mais flexível e eficiente a APIs REST. Já foi detectado pelo seu radar?

    No episódio 55 do Hipsters Ponto Tech, o pessoal da Pipefy disse que uma API GraphQL no back-end, junto ao React e shadow DOM no front-end, levaram a uma melhoria drástica na performance. Outras empresas brasileiras como a GetNinjas e a Taller também tem usado o GraphQL.

    Empresas gringas como a Shopify, Artsy e Yelp provêem APIs com suporte ao GraphQL. O GitHub migrou sua API de REST para GraphQL.

    E claro, o Facebook, que desenvolveu o GraphQL em 2012 para uso interno e o abriu ao público em 2015.

    Quais as limitações de uma API REST?

    Para ilustrar o que pode ser melhorado em uma API REST, vamos utilizar a versão 3 da API do GitHub, considerada muito consistente e aderente aos princípios REST.

    Queremos uma maneira de avaliar bibliotecas open-source. Para isso, dado um repositório do GitHub, desejamos descobrir:

    • o número de stars
    • o número de pull requests abertos

    Como exemplo, vamos usar o repositório de uma biblioteca NodeJS muito usada: o framework Web minimalista Express.

    Banner do Guia Tático Alura sobre carreira em tecnologia, destacando o mapa da carreira tech. A imagem convida a explorar diferentes caminhos profissionais, comparar possibilidades e encontrar a próxima fase da carreira na área de tecnologia, com chamada “Explore o mapa”.

    Obtendo detalhes de um repositório

    Lendo a documentação da API do GitHub, descobrimos que para obter detalhes sobre um repositório, devemos enviar uma requisição GET para /repos/:owner/:repo. Então, para o repositório do Express, devemos fazer:

    
    GET https://api.github.com/repos/expressjs/express
    

    Como resposta, obtemos:

    • 2.2 KB gzipados transferidos, incluindo cabeçalhos
    • 6.1 KB de JSON em 110 linhas, quando descompactado
    
    200 OK
    Content-type: application/json; charset=utf-8
    
    
    {
        "id": 237159,
        "name": "express",
        "full_name": "expressjs/express",
        "private": false,
        "html_url": "https://github.com/expressjs/express",
        "description": "Fast, unopinionated, minimalist web framework for node.",
        "fork": false,
        "issues_url": "https://api.github.com/repos/expressjs/express/issues{/number}",
        "pulls_url": "https://api.github.com/repos/expressjs/express/pulls{/number}",
        "stargazers_count": 33508,
        ... 
    }
    

    O JSON retornado tem diversas informações sobre o repositório do Express. Por meio da propriedade stargazers_count, descobrimos que há mais de 33 mil stars.

    Porém, não temos o número de pull requests abertos.

    Obtendo os pull requests de um repositório

    Na propriedade pulls_url, temos apenas uma URL: https://api.github.com/repos/expressjs/express/pulls{/number}.

    Um bom palpite é que sem esse {/number} teremos a lista de todos os pull requests, o que pode ser confirmado na seção de pull requests da documentação da API REST do GitHub.

    O {/number} da URL segue o modelo proposto pela RFC 6570 (URI Template).

    Mas como filtrar apenas pelos pull requests abertos?

    Na mesma documentação, verificamos que podemos usar a URL /repos/:owner/:repo/pulls?state=open ou simplesmente /repos/:owner/:repo/pulls, já que o filtro por pull requests abertos é aplicado por padrão. Em outras palavras, precisamos de outra requisição:

    
    GET https://api.github.com/repos/expressjs/express/pulls
    

    A resposta é:

    • 54.1 KB gzipados transferidos, incluindo cabeçalhos
    • 514 KB de JSON em 9150 linhas, quando descompactado
    
    200 OK
    Content-type: application/json; charset=utf-8
    Link: <https://api.github.com/repositories/237159/pulls?page=2>; rel="next",
          <https://api.github.com/repositories/237159/pulls?page=2>; rel="last"
    
    
    [
        {
            //um pull request...
            "url": "https://api.github.com/repos/expressjs/express/pulls/3391",
            "id": 134639441,
            "html_url": "https://github.com/expressjs/express/pull/3391",
            "diff_url": "https://github.com/expressjs/express/pull/3391.diff",
            "patch_url": "https://github.com/expressjs/express/pull/3391.patch",
            "issue_url": "https://api.github.com/repos/expressjs/express/issues/3391",
            "number": 3391,
            "state": "open",
            "locked": false,
            "title": "Update guide to ES6",
            "user": {
                "login": "jevtovich",
                "id": 13847095,
                "avatar_url": "https://avatars3.githubusercontent.com/u/13847095?v=4",
                ...
            },
            "body": "",
            "created_at": "2017-08-08T11:40:32Z",
            "updated_at": "2017-08-08T17:28:01Z",
            ...
        },
        {
            //outro pull request...
            "url": "https://api.github.com/repos/expressjs/express/pulls/3390",
            "id": 134634529,
            ...
        },
        ...
    ]
    

    É retornado um array de 30 objetos que representam os pull requests. Cada objeto ocupa uma média de 300 linhas, com informações sobre status, descrição, autores, commits e diversas URLs relacionadas.

    Disso tudo, só queremos saber a contagem: 30 pull requests. Não precisamos de nenhuma outra informação.

    Mas há outra questão: o resultado é paginado com 30 resultados por página, por padrão, conforme descrito na seção de paginação da documentação da API REST do GitHub.

    As URLs das próximas páginas devem ser obtidas a partir do cabeçalho de resposta Link, extraindo o rel (link relation) next.

    Os links para as próximas páginas seguem o conceito de hipermídia do REST e foram implementados usando o cabeçalho Link e o formato descrito na RFC 5988 (Web Linking). Essa RFC sugere um punhado de link relations padronizados.

    Então, a partir do next, seguimos para a próxima página:

    
    GET https://api.github.com/repositories/237159/pulls?page=2
    

    Temos como resposta:

    • 26.9 KB gzipados transferidos, incluindo cabeçalhos
    • 248 KB de JSON em 4394 linhas, quando descompactado
    
    200 OK
    Content-type: application/json; charset=utf-8
    Link: <https://api.github.com/repositories/237159/pulls?page=1>; rel="first",
          <https://api.github.com/repositories/237159/pulls?page=1>; rel="prev"
    
    
    [
      {
        //um pull request...
        "url": "https://api.github.com/repos/expressjs/express/pulls/2730",
        "id": 41965836,
        ...
      },
      {
        //outro pull request...
        "url": "https://api.github.com/repos/expressjs/express/pulls/2703",
        "id": 39735937,
         ...
      },
      ...
    ]
    

    O array retornado contabiliza mais 14 objetos representando os pull requests. Dessa vez, não há o link relation next, indicando que é a última página.

    Então, sabemos que há 44 (30 + 14) pull requests abertos no repositório do Express.

    Resumindo

    No momento da escrita desse artigo, o número de stars do Express no GitHub é 33508 e o de pull requests abertos é 44. Para descobrir isso, tivemos que:

    • disparar 3 requisições ao servidor
    • baixar 83.2 KB de informações gzipadas e cabeçalhos
    • fazer parse de 768.1 KB de JSON ou 13654 linhas

    O que daria pra melhorar? Ir menos vezes ao servidor, baixando menos dados!

    Não é um problema com o REST em si, mas uma discrepância entre a modelagem atual da API e as nossas necessidades.

    Poderíamos pedir para o GitHub implementar um recurso específico que retornasse somente as informações, tudo em apenas um request.

    Mas será que o pessoal do GitHub vai nos atender?

    Mais flexibilidade e eficiência com GraphQL

    Numa API GraphQL, o cliente diz exatamente os dados que quer da API, tornando a requisição muito flexível.

    A API, por sua vez, retorna apenas os dados que o cliente pediu, fazendo com que a transferência da resposta seja bastante eficiente.

    Mas afinal de contas, o que é GraphQL?

    GraphQL não é um banco de dados, não é um substituto do SQL, não é uma ferramenta do lado do servidor e não é específico para React (apesar de muito usado por essa comunidade).

    Um servidor que aceita requisições GraphQL poderia ser implementado em qualquer linguagem usando qualquer banco de dados. Há várias bibliotecas de diferentes plataformas que ajudam a implementar esse servidor.

    Clientes que enviam requisições GraphQL também poderiam ser implementados em qualquer tecnologia: web, mobile, desktop, etc. Diversas bibliotecas auxiliam nessa tarefa.

    GraphQL é uma query language para APIs que foi especificada pelo Facebook.

    A query language do GraphQL é fortemente tipada e descreve, através de um schema, o modelo de dados oferecido pelo serviço. Esse schema pode ser usado para verificar se uma dada requisição é válida e, caso seja, executar as tarefas no back-end e estruturar os dados da resposta.

    Um cliente pode enviar 3 tipos de requisições GraphQL, os root types:

    • query, para consultas;
    • mutation, para enviar dados;
    • subscription, para comunicação baseada em eventos.

    Montando uma consulta GraphQL

    A versão 4 da API do GitHub, a mais recente, dá suporte a requisições GraphQL.

    Para fazer nossa consulta às stars e aos pull requests abertos do repositório do Express usando a API GraphQL do GitHub, devemos começar com a query:

    
    query {
    }
    

    Vamos usar o campo repository da query, que recebe os argumentos owner e name, ambos obrigatórios e do tipo String. Para buscar pelo Express, devemos fazer:

    
    query {
      repository (owner: "expressjs", name: "express") {
      }
    }
    

    A partir do objeto repository, podemos descobrir o número de stars por meio do campo stargazers. Como queremos apenas a quantidade de itens, só precisamos obter propriedade totalCount dessa connection.

    
    query {
      repository (owner: "expressjs", name: "express") {
        stargazers {
          totalCount
        }
      }
    }
    

    Para encontrarmos o número de pull requests abertos, basta usarmos o campo pullRequests do repository. O filtro por pull requests abertos não é aplicado por padrão. Por isso, usaremos o argumento states. Da connection, obteremos apenas o totalCount.

    
    query { 
      repository(owner: "expressjs", name: "express") {
        stargazers {
          totalCount
        }
        pullRequests(states: OPEN) {
          totalCount
        }
      } 
    }
    

    Basicamente, é essa a nossa consulta! Bacana, não?

    Uma maneira de "rascunhar" consultas GraphQL é usar a ferramenta GraphiQL, que permite explorar APIs pelo navegador. Há até code completion! Boa parte das APIs GraphQL dá suporte, incluindo a do GitHub.

    Tá, mas como enviar a consulta para a API?

    A maneira mais comum de publicar APIs GraphQL é usar a boa e velha Web, com seu protocolo HTTP.

    Apesar do HTTP ser o mais usado para publicar APIs GraphQL, teoricamente não há limitações em usar outros protocolos.

    Uma API GraphQL possui apenas um endpoint e, consequentemente, só uma URL.

    É possível enviar requisições GraphQL usando o método GET do HTTP, com a consulta como um parâmetro na URL. Porém, como as consultas são relativamente grandes e requisições GET tem um limite de tamanho, o método mais utilizado pelas APIs GraphQL é o POST, com a consulta no corpo da requisição.

    No caso do GitHub a URL do endpoint GraphQL é: https://api.github.com/graphql

    O GitHub só dá suporte ao método POST e o corpo da requisição deve ser um JSON cuja propriedade query conterá uma String com a nossa consulta.

    Mesmo para consultas a repositórios públicos, a API GraphQL do GitHub precisa de um token de autorização.

    
    POST https://api.github.com/graphql
    Content-type: application/json
    Authorization: bearer f023615deb415e...
    
    
    {
    "query":    "query {
                    repository(owner: \"expressjs\", name: \"express\") { 
                        stargazers {
                            totalCount
                        } 
                        pullRequests(states: OPEN) {
                            totalCount
                        }
                    }
                }"
    }
    

    O retorno será um JSON em que os dados estarão na propriedade data:

    
    {
        "data": {
            "repository": {
                "stargazers": {
                    "totalCount": 33508
                },
                "pullRequests": {
                    "totalCount": 44
                }
            }
        }
    }
    

    Na verdade, os JSONs de requisição e resposta ficam em apenas 1 linha. Formatamos o código anterior em várias linhas para melhor legibilidade.

    Repare que os campos da consulta, dentro da query, tem exatamente a mesma estrutura do retorno da API. É como se a resposta fosse a própria consulta, mas com os valores preenchidos. Por isso, montar consultas com GraphQL é razoavelmente intuitivo.

    Resumindo

    Obtivemos os mesmos resultados: 33508 stars e 44 pull requests. Para isso, tivemos que:

    • disparar apenas 1 requisição ao servidor
    • baixar somente 996 bytes de informações gzipadas, incluindo cabeçalhos
    • fazer parse só de 93 bytes de JSON

    São 66,67% requisições a menos, 98,82% menos dados e cabeçalhos trafegados e 99,99% menos JSON a ser "parseado". Ou seja, MUITO mais rápido.

    Considerações finais

    Poderíamos buscar outros dados da API do GitHub: o número de issues abertas, a data da última release, informações sobre o último commit, etc.

    Uma coisa é certa: com uma consulta GraphQL, eu faria menos requisições e receberia menos dados desnecessários. Mais flexibilidade e mais eficiência.

    Porém, existem várias outras questões que surgem ao estudar o GraphQL:

    • como fazer um servidor que atenda a toda essa flexibilidade?
    • é possível gerar uma documentação a partir do código para a minha API?
    • vale a pena migrar minha API pra GraphQL?
    • posso fazer uma "casca" GraphQL para uma API REST já existente?
    • como implementar um cliente sem muito trabalho?
    • quais os pontos ruins dessa tecnologia e desafios na implementação?

    E você? O que achou do GraphQL? Já usa? Usaria?

    Banner do Guia Tático Alura sobre carreira em tecnologia, destacando o mapa da carreira tech. A imagem convida a explorar diferentes caminhos profissionais, comparar possibilidades e encontrar a próxima fase da carreira na área de tecnologia, com chamada “Explore o mapa”.

    Avalie este artigo

    • Foto de alexandre.aquiles

      Autor(a)

      alexandre.aquiles

    Explore por tópico

    • Back-end
    • Dados
    • DevOps
    • Front-end
    • Gestão & Negócios
    • Institucionais
    • Inteligência Artificial
    • Mobile
    • UX & Design

    Leia também

    • 02/02/2023

      Como formatar datas, horas e moedas em JavaScript?

      Ler mais
    • 08/12/2022

      Atalhos IntelliJ: dicas e truques para formatar código, identar e aumentar produtividade na IDE

      Ler mais
    • 18/08/2014

      Big Pipe: streaming e composição de páginas

      Ler mais
    Ver mais conteúdos

    Inscreva-se em nossa Newsletter

    Fique por dentro de conteúdos, insights e oportunidades do universo tech. Receba novidades e lançamentos direto no seu e-mail.

    Institucional

    • Sobre nós
    • Trabalhe Conosco
    • Para Empresas
    • Para Escolas
    • Política de Privacidade
    • Compromisso de Integridade
    • Termos de Uso
    • Canal de Ética
    • Código de Ética
    • Fale Conosco
    • Documentos Institucionais
    • Status
    Institucional
    • Sobre nós
    • Trabalhe Conosco
    • Para Empresas
    • Para Escolas
    • Política de Privacidade
    • Compromisso de Integridade
    • Termos de Uso
    • Canal de Ética
    • Código de Ética
    • Fale Conosco
    • Documentos Institucionais
    • Status

    A Alura

    • Como Funciona
    • Inteligência Artificial
    • Plataforma
    • Depoimentos
    • Instrutores(as)
    • Dev em <T>
    • Luri, a Inteligência Artificial da Alura
    • IA Conference
    • Cursos Imersivos
    • Perguntas Frequentes
    A Alura
    • Como Funciona
    • Inteligência Artificial
    • Plataforma
    • Depoimentos
    • Instrutores(as)
    • Dev em <T>
    • Luri, a Inteligência Artificial da Alura
    • IA Conference
    • Cursos Imersivos
    • Perguntas Frequentes

    Conteúdos

    • Alura Cases
    • Imersão Engenharia de Software: Dev na Era da IA
    • Artigos
    • Podcasts
    • Artigos de educação corporativa
    Conteúdos
    • Alura Cases
    • Imersão Engenharia de Software: Dev na Era da IA
    • Artigos
    • Podcasts
    • Artigos de educação corporativa
    Uma Empresa do GrupoLogo Grupo Alun

    Outras empresas do Grupo Alun

    • FIAP
    • STARTSE
    • PM3
    • LUMINA

    Ao submeter seu e-mail, você concorda com a política de privacidade da Alura.

    Redes Sociais & Apps

    instagram
    youtube
    tiktok
    x
    appStore
    googlePlay
    Uma Empresa do GrupoLogo Grupo Alun

    Outras empresas do Grupo Alun

    • FIAP
    • STARTSE
    • PM3
    • LUMINA

    Ao submeter seu e-mail, você concorda com a política de privacidade da Alura.

    Redes Sociais & Apps

    instagram
    youtube
    tiktok
    x
    appStore
    googlePlay
    Alura