Introduction à GraphQL et Go
GraphQL est un langage de requête pour les API, développé par Facebook. Contrairement à REST, où chaque endpoint renvoie une structure de données fixe, GraphQL permet au client de demander uniquement les champs dont il a besoin. Cela réduit le nombre de requêtes et le volume de données transmises. Go (Golang) est un excellent choix pour créer des API hautes performances grâce à sa rapidité, son typage statique et son support intégré de la concurrence.
Dans ce tutoriel, nous allons créer une API GraphQL simple en Go pour gérer une liste de livres. Vous apprendrez à configurer le serveur, définir le schéma, écrire des résolveurs et exécuter des requêtes et des mutations.
Configuration du projet et installation des bibliothèques
Initialisation du module Go
Créez un nouveau répertoire pour le projet et initialisez le module :
mkdir graphql-go-tutorialcd graphql-go-tutorialgo mod init graphql-go-tutorialInstallation de la bibliothèque graphql-go
Nous utiliserons la bibliothèque populaire graphql-go/graphql. Installez-la avec la commande :
go get github.com/graphql-go/graphqlgo get github.com/graphql-go/handlerLa première bibliothèque fournit le cœur de GraphQL, et la seconde un gestionnaire HTTP pour l'intégration avec le serveur web.
Création de la structure de données et du schéma GraphQL
Définition du type Book
Créez le fichier main.go et commencez par définir la structure de données du livre et le type GraphQL correspondant :
package main
import ( "github.com/graphql-go/graphql" "github.com/graphql-go/handler" "net/http")
// Book — structure de données du livretype Book struct { ID string `json:"id"` Title string `json:"title"` Author string `json:"author"` Year int `json:"year"`}
// Définition du type GraphQL pour le livrevar 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}, }, },)Création de la requête racine (Query)
Ajoutons un stockage en mémoire des livres et une requête racine pour obtenir la liste et un livre spécifique :
// Simulation de base de donnéesvar books = []Book{ {ID: "1", Title: "Guerre et Paix", Author: "Léon Tolstoï", Year: 1869}, {ID: "2", Title: "Crime et Châtiment", Author: "Fiodor Dostoïevski", Year: 1866}, {ID: "3", Title: "Le Maître et Marguerite", Author: "Mikhaïl Boulgakov", Year: 1967},}
// Requête racinevar 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 }, }, }, },)Ajout des mutations (Mutation)
Les mutations permettent de modifier les données. Ajoutons la possibilité d'ajouter de nouveaux livres :
// Mutation pour ajouter un livrevar mutationType = graphql.NewObject(