Introducción a GraphQL y Go
GraphQL es un lenguaje de consultas para API, desarrollado por Facebook. A diferencia de REST, donde cada endpoint devuelve una estructura de datos fija, GraphQL permite al cliente solicitar solo los campos que necesita. Esto reduce la cantidad de solicitudes y el volumen de datos transferidos. Go (Golang) es una excelente opción para crear API de alto rendimiento gracias a su velocidad, tipado estático y soporte integrado para concurrencia.
En este tutorial crearemos una API GraphQL simple en Go para gestionar una lista de libros. Aprenderá cómo configurar el servidor, definir el esquema, escribir resolvers y ejecutar consultas y mutaciones.
Configuración del proyecto e instalación de bibliotecas
Inicialización del módulo Go
Cree un nuevo directorio para el proyecto e inicialice el módulo:
mkdir graphql-go-tutorialcd graphql-go-tutorialgo mod init graphql-go-tutorialInstalación de la biblioteca graphql-go
Usaremos la biblioteca popular graphql-go/graphql. Instálela con el comando:
go get github.com/graphql-go/graphqlgo get github.com/graphql-go/handlerLa primera biblioteca proporciona el núcleo de GraphQL, y la segunda un manejador HTTP para la integración con el servidor web.
Creación de la estructura de datos y el esquema GraphQL
Definición del tipo Book
Cree el archivo main.go y comience definiendo la estructura de datos del libro y el tipo GraphQL correspondiente:
package main
import ( "github.com/graphql-go/graphql" "github.com/graphql-go/handler" "net/http")
// Book — estructura de datos del librotype Book struct { ID string `json:"id"` Title string `json:"title"` Author string `json:"author"` Year int `json:"year"`}
// Definimos el tipo GraphQL para el librovar bookType = graphql.NewObject( graphql.ObjectConfig{ Name: "Book", Fields: graphql.Fields{ "id": &graphql.Field{Type: graphql.String}, "title": &graphql.Field{Type: graphql.String}, "author": &graphql.Field{Type: graphql.String}, "year": &graphql.Field{Type: graphql.Int}, }, },)Creación de la consulta raíz (Query)
Añadiremos un almacenamiento de libros en memoria y una consulta raíz para obtener la lista y un libro individual:
// Simulación de base de datosvar books = []Book{ {ID: "1", Title: "Guerra y Paz", Author: "León Tolstói", Year: 1869}, {ID: "2", Title: "Crimen y Castigo", Author: "Fiódor Dostoyevski", Year: 1866}, {ID: "3", Title: "El Maestro y Margarita", Author: "Mijaíl Bulgákov", Year: 1967},}
// Consulta raízvar queryType = graphql.NewObject( graphql.ObjectConfig{ Name: "Query", Fields: graphql.Fields{ "books": &graphql.Field{ Type: graphql.NewList(bookType), Resolve: func(p graphql.ResolveParams) (interface{}, error) { return books, nil }, }, "book": &graphql.Field{ Type: bookType, Args: graphql.FieldConfigArgument{ "id": &graphql.ArgumentConfig{Type: graphql.String}, }, Resolve: func(p graphql.ResolveParams) (interface{}, error) { id, _ := p.Args["id"].(string) for _, book := range books { if book.ID == id { return book, nil } } return nil, nil }, }, }, },)Añadir mutaciones (Mutation)
Las mutaciones permiten modificar datos. Añadiremos la posibilidad de agregar nuevos libros:
// Mutación para añadir un librovar mutationType = graphql.NewObject(```