GraphQL 和 Go 语言入门
GraphQL 是一种由 Facebook 开发的 API 查询语言。与 REST 不同,REST 的每个端点返回固定的数据结构,而 GraphQL 允许客户端只请求它需要的字段。这减少了请求次数和传输的数据量。Go (Golang) 凭借其速度、静态类型和内置并发支持,是构建高性能 API 的绝佳选择。
在本教程中,我们将使用 Go 创建一个简单的 GraphQL API 来管理书籍列表。您将学习如何设置服务器、定义模式、编写解析器以及执行查询和变更操作。
项目设置和库安装
初始化 Go 模块
为项目创建一个新目录并初始化模块:
mkdir graphql-go-tutorialcd graphql-go-tutorialgo mod init graphql-go-tutorial安装 graphql-go 库
我们将使用流行的 graphql-go/graphql 库。使用以下命令安装它:
go get github.com/graphql-go/graphqlgo get github.com/graphql-go/handler第一个库提供 GraphQL 核心功能,第二个库提供用于与 Web 服务器集成的 HTTP 处理器。
创建数据结构和 GraphQL 模式
定义 Book 类型
创建 main.go 文件,并开始定义书籍的数据结构以及相应的 GraphQL 类型:
package main
import ( "github.com/graphql-go/graphql" "github.com/graphql-go/handler" "net/http")
// Book — 书籍的数据结构type Book struct { ID string `json:"id"` Title string `json:"title"` Author string `json:"author"` Year int `json:"year"`}
// 定义书籍的 GraphQL 类型var 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}, }, },)创建根查询 (Query)
让我们添加一个内存中的书籍存储以及用于获取书籍列表和单本书籍的根查询:
// 模拟数据库var books = []Book{ {ID: "1", Title: "战争与和平", Author: "列夫·托尔斯泰", Year: 1869}, {ID: "2", Title: "罪与罚", Author: "费奥多尔·陀思妥耶夫斯基", Year: 1866}, {ID: "3", Title: "大师与玛格丽特", Author: "米哈伊尔·布尔加科夫", Year: 1967},}
// 根查询var 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 }, }, }, },)添加变更操作 (Mutation)
变更操作允许修改数据。让我们添加添加新书籍的功能:
// 用于添加书籍的变更操作var mutationType = graphql.NewObject(