Introdução ao GraphQL e Go
GraphQL é uma linguagem de consulta para APIs, desenvolvida pelo Facebook. Diferente do REST, onde cada endpoint retorna uma estrutura de dados fixa, o GraphQL permite que o cliente solicite apenas os campos de que precisa. Isso reduz o número de requisições e o volume de dados transferidos. Go (Golang) é uma excelente escolha para criar APIs de alto desempenho devido à sua velocidade, tipagem estática e suporte nativo à concorrência.
Neste tutorial, criaremos uma API GraphQL simples em Go para gerenciar uma lista de livros. Você aprenderá como configurar o servidor, definir o schema, escrever resolvers e executar queries e mutations.
Configuração do projeto e instalação das bibliotecas
Inicialização do módulo Go
Crie um novo diretório para o projeto e inicialize o módulo:
mkdir graphql-go-tutorialcd graphql-go-tutorialgo mod init graphql-go-tutorialInstalação da biblioteca graphql-go
Usaremos a biblioteca popular graphql-go/graphql. Instale-a usando o comando:
go get github.com/graphql-go/graphqlgo get github.com/graphql-go/handlerA primeira biblioteca fornece o núcleo do GraphQL, e a segunda fornece um handler HTTP para integração com o servidor web.
Criação da estrutura de dados e do schema GraphQL
Definição do tipo Book
Crie o arquivo main.go e comece definindo a estrutura de dados do livro e o tipo GraphQL correspondente:
package main
import ( "github.com/graphql-go/graphql" "github.com/graphql-go/handler" "net/http")
// Book — estrutura de dados do livrotype Book struct { ID string `json:"id"` Title string `json:"title"` Author string `json:"author"` Year int `json:"year"`}
// Definimos o tipo GraphQL para o livrovar 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}, }, },)Criação da Query raiz (Query)
Vamos adicionar um armazenamento in-memory de livros e uma query raiz para obter a lista e um livro específico:
// Simulação de banco de dadosvar books = []Book{ {ID: "1", Title: "Guerra e Paz", Author: "Liev Tolstói", Year: 1869}, {ID: "2", Title: "Crime e Castigo", Author: "Fiódor Dostoiévski", Year: 1866}, {ID: "3", Title: "O Mestre e a Margarida", Author: "Mikhail Bulgákov", Year: 1967},}
// Query raizvar 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 }, }, }, },)Adicionando Mutations
Mutations permitem modificar dados. Vamos adicionar a capacidade de incluir novos livros:
// Mutation para adicionar um livrovar mutationType = graphql.NewObject(```