GraphQL API con Go: tutorial paso a paso para principiantes

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción a GraphQL y Go

GraphQL es un lenguaje de consultas para API que permite a los clientes obtener exactamente los datos que necesitan, y nada más. A diferencia de REST, donde cada endpoint devuelve una estructura de datos fija, GraphQL brinda flexibilidad y control. En combinación con Go (Golang), un lenguaje rápido, con seguridad de tipos y simple, obtienes una herramienta poderosa para crear servicios web modernos.

En este tutorial crearemos una API GraphQL simple en Go desde cero. Aprenderás a instalar dependencias, describir el esquema, implementar resolutores y ejecutar el servidor. El artículo está orientado a principiantes, por lo que todos los pasos están explicados en detalle.



1. Preparación del proyecto e instalación de dependencias

Antes de escribir código, asegúrate de tener instalado Go versión 1.18 o superior. Crea un nuevo directorio para el proyecto e inicializa el módulo:

mkdir graphql-go-tutorialcd graphql-go-tutorialgo mod init graphql-go-tutorial


Elección de la biblioteca: gqlgen

Existen varias bibliotecas para trabajar con GraphQL en Go. Usaremos gqlgen, un popular generador de código que crea tipos y resolutores basados en el esquema. Instálalo:

go get github.com/99designs/gqlgen@latest


Inicialización de gqlgen

Ejecuta el comando para crear los archivos por defecto:

go run github.com/99designs/gqlgen init

Este comando creará varios archivos:

  • graph/schema.graphqls — archivo del esquema GraphQL;
  • graph/resolver.go — plantilla de resolutores;
  • server.go — punto de entrada del servidor;
  • gqlgen.yml — configuración de generación.


2. Descripción del esquema GraphQL

Abre el archivo graph/schema.graphqls. Por defecto ya hay un ejemplo con el tipo Todo. Lo ampliaremos agregando el tipo User y algunas consultas.

Reemplaza el contenido del archivo por lo siguiente:

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!}

Aquí definimos:

  • User — usuario con campos id, name, email.
  • Todo — tarea con campos id, text, done y una referencia al usuario.
  • Query — puntos de entrada para lectura de datos.
  • Mutation — operaciones para modificar datos.


3. Generación de código e implementación de resolutores

Después de describir el esquema, necesitas generar el código Go. Ejecuta:

go run github.com/99designs/gqlgen generate

Esto creará los archivos models_gen.go y actualizará resolver.go. Ahora abre graph/resolver.go.



Agregar almacenamiento de datos

Para simplificar, almacenaremos los datos en memoria. Agrega la estructura en resolver.go:

type Resolver struct {    Users []*model.User    Todos []*model.Todo}

No olvides importar el paquete model.



Implementación de consultas (Query)

Busca los métodos generados para Query. Los implementamos:

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