Introdução ao GraphQL e Go
GraphQL é uma linguagem de consulta para APIs que permite aos clientes obter exatamente os dados de que precisam, sem excessos. Diferente do REST, onde cada endpoint retorna uma estrutura de dados fixa, o GraphQL oferece flexibilidade e controle. Combinado com Go (Golang) — uma linguagem rápida, com segurança de tipos e simples — você obtém uma ferramenta poderosa para criar serviços web modernos.
Neste tutorial, criaremos uma API GraphQL simples em Go do zero. Você aprenderá a instalar dependências, descrever o esquema, implementar resolvers e iniciar o servidor. O artigo é voltado para iniciantes, portanto, todas as etapas são explicadas em detalhes.
1. Preparação do projeto e instalação de dependências
Antes de escrever código, certifique-se de ter o Go versão 1.18 ou superior instalado. Crie um novo diretório para o projeto e inicialize o módulo:
mkdir graphql-go-tutorialcd graphql-go-tutorialgo mod init graphql-go-tutorialEscolha da biblioteca: gqlgen
Existem várias bibliotecas para trabalhar com GraphQL em Go. Usaremos o gqlgen — um popular gerador de código que cria tipos e resolvers com base no esquema. Instale-o:
go get github.com/99designs/gqlgen@latestInicialização do gqlgen
Execute o comando para criar os arquivos padrão:
go run github.com/99designs/gqlgen initEste comando criará vários arquivos:
graph/schema.graphqls— arquivo de esquema GraphQL;graph/resolver.go— esboço dos resolvers;server.go— ponto de entrada do servidor;gqlgen.yml— configuração de geração.
2. Descrição do esquema GraphQL
Abra o arquivo graph/schema.graphqls. Por padrão, já existe um exemplo com o tipo Todo. Vamos expandi-lo adicionando o tipo User e algumas consultas.
Substitua o conteúdo do arquivo pelo seguinte:
type User { id: ID! name: String! email: String!}
type Todo { id: ID! text: String! done: Boolean! user: User!}
type Query { todos: [Todo!]! users: [User!]! user(id: ID!): User}
type Mutation { createTodo(text: String!, userId: ID!): Todo! markDone(id: ID!): Todo!}Aqui definimos:
- User — usuário com campos id, name, email.
- Todo — tarefa com campos id, text, done e referência ao usuário.
- Query — pontos de entrada para leitura de dados.
- Mutation — operações para modificar dados.
3. Geração de código e implementação de resolvers
Após descrever o esquema, é necessário gerar o código Go. Execute:
go run github.com/99designs/gqlgen generateIsso criará os arquivos models_gen.go e atualizará o resolver.go. Agora abra o graph/resolver.go.
Adicionando armazenamento de dados
Para simplificar, armazenaremos os dados em memória. Adicione a estrutura no resolver.go:
type Resolver struct { Users []*model.User Todos []*model.Todo}Não se esqueça de importar o pacote model.
Implementação de consultas (Query)
Encontre os métodos gerados para Query. Vamos implementá-los:
func (r *queryResolver) Todos(ctx context.Context) ([]*model.Todo, error) { return r.Resolver.Todos, nil}
func (r *queryResolver) Users(ctx context.Context) ([]*model.User, error) { return r.Resolver.Users, nil}
func (r *queryResolver) User(ctx context.Context, id string) (*model.User, error) { for _, u := range r.Resolver.Users { if u.ID == id { return u, nil } } return nil, fmt.Errorf("user not found")}
Blogs
Book Recommendations
Leia também