使用Go构建GraphQL API:面向初学者的逐步教程

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么 GraphQL 和 Go 是完美组合



现代 Web 开发需要灵活且高性能的 API。REST API 尽管广受欢迎,但常常存在数据过度获取或获取不足的问题。GraphQL 通过允许客户端精确请求所需内容解决了这一问题。而 Go(Golang) 凭借其速度、简洁性以及内置的并发支持,成为构建 GraphQL 服务器的理想语言。



在本教程中,我们将逐步用 Go 创建一个功能完备的 GraphQL API。您将学习如何设置服务器、定义模式、编写解析器以及实现查询和变更操作。文章结束时,您将拥有一个可随时与任何客户端集成的可用 API。



步骤 1:项目设置与依赖安装



首先,让我们创建一个新的 Go 模块并安装必要的库。我们将使用两个流行的 GraphQL 库:graphql-go 和 graphql-go-handler。



1.1. 模块初始化



go mod init graphql-tutorial


1.2. 安装库



go get github.com/graphql-go/graphqlgo get github.com/graphql-go/handler


这些库提供了处理模式、类型和解析器所需的所有工具。



步骤 2:创建基本 GraphQL 模式



模式是 GraphQL API 的核心。它定义了可以检索哪些数据以及可以执行哪些操作。让我们从一个简单的"User"模型开始。



2.1. 定义 User 类型



import "github.com/graphql-go/graphql"

var userType = graphql.NewObject(graphql.ObjectConfig{ Name: "User", Fields: graphql.Fields{ "id": &graphql.Field{ Type: graphql.Int, }, "name": &graphql.Field{ Type: graphql.String, }, "email": &graphql.Field{ Type: graphql.String, }, },})


2.2. 创建根查询



var rootQuery = graphql.NewObject(graphql.ObjectConfig{    Name: "RootQuery",    Fields: graphql.Fields{        "user": &graphql.Field{            Type: userType,            Args: graphql.FieldConfigArgument{                "id": &graphql.ArgumentConfig{                    Type: graphql.Int,                },            },            Resolve: func(p graphql.ResolveParams) (interface{}, error) {                id, _ := p.Args["id"].(int)                // 此处为从数据库获取用户的逻辑                return getUserByID(id), nil            },        },    },})


2.3. 组合成模式



var schema, _ = graphql.NewSchema(graphql.SchemaConfig{    Query: rootQuery,})


步骤 3:实现解析器和服务器



现在模式已就绪,我们需要编写解析器——即实际返回数据的函数。为简单起见,我们将使用内存存储。



3.1. 内存存储



type User struct {    ID    int    `json:"id"`    Name  string `json:"name"`    Email string `json:"email"`}

var users = []User{ {ID: 1, Name: "Ivan Petrov", Email: "ivan@example.com"}, {ID: 2, Name: "Maria Sidorova", Email: "maria@example.com"},}

func getUserByID(id int) *User { for _, u := range users { if u.ID == id { return &u } } return nil}


3.2. 启动 HTTP 服务器



package main

import ( "fmt" "log" "net/http"

"github.com/graphql-go/handler")

func main() { h := handler.New(&handler.Config{ Schema: &schema, Pretty: true, GraphiQL: true, // 启用内置 IDE })

http.Handle("/graphql", h) fmt.Println("服务器已启动在")

博客

书籍推荐