引言:为什么 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-tutorial1.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("服务器已启动在")