前言
GraphQL 是一种用于 API 开发的查询语言,它可以让前端开发人员快速、简单地获取所需的数据。Go 是一种高效、简洁的编程语言,它在网络编程和并发编程方面具有很高的性能。将 GraphQL 和 Go 结合使用可以构建高效、易于维护的数据交换 API。本文将介绍如何使用 Go 实现 GraphQL API。
环境准备
在开始之前,需要安装 Go 和 GraphQL。Go 安装方法请参考官方文档。GraphQL 可以通过 npm 安装:
npm install graphql
创建 GraphQL API
定义数据类型
在 Go 中,我们需要定义数据类型来表示我们的数据。下面是一个简单的例子,定义了一个 Todo 类型:
type Todo struct { ID string `json:"id"` Title string `json:"title"` Done bool `json:"done"` }
定义查询类型
在 GraphQL 中,我们需要定义查询类型来表示我们的查询。下面是一个简单的例子,定义了一个查询类型:
type Query { todos: [Todo] }
实现查询功能
在 Go 中,我们需要实现查询功能来处理查询请求。下面是一个简单的例子,实现了查询功能:
func (r *queryResolver) Todos(ctx context.Context) ([]*model.Todo, error) { return []*model.Todo{ {ID: "1", Title: "Todo 1", Done: false}, {ID: "2", Title: "Todo 2", Done: true}, }, nil }
创建 GraphQL Schema
最后,我们需要创建 GraphQL Schema 来将查询类型和查询功能连接起来。下面是一个简单的例子,创建了 GraphQL Schema:
func main() { schema := graphql.MustParseSchema(` type Todo { id: ID! title: String! done: Boolean! } type Query { todos: [Todo] } `, &queryResolver{}) http.Handle("/graphql", &relay.Handler{Schema: schema}) log.Fatal(http.ListenAndServe(":8080", nil)) }
示例代码
下面是一个完整的示例代码,实现了一个简单的 Todo 应用程序:
package main import ( "context" "log" "net/http" "github.com/graphql-go/graphql" "github.com/graphql-go/handler" ) type Todo struct { ID string `json:"id"` Title string `json:"title"` Done bool `json:"done"` } var todos = []*Todo{ {ID: "1", Title: "Todo 1", Done: false}, {ID: "2", Title: "Todo 2", Done: true}, } var todoType = graphql.NewObject(graphql.ObjectConfig{ Name: "Todo", Fields: graphql.Fields{ "id": &graphql.Field{ Type: graphql.NewNonNull(graphql.ID), Resolve: func(p graphql.ResolveParams) (interface{}, error) { if todo, ok := p.Source.(*Todo); ok { return todo.ID, nil } return nil, nil }, }, "title": &graphql.Field{ Type: graphql.NewNonNull(graphql.String), Resolve: func(p graphql.ResolveParams) (interface{}, error) { if todo, ok := p.Source.(*Todo); ok { return todo.Title, nil } return nil, nil }, }, "done": &graphql.Field{ Type: graphql.NewNonNull(graphql.Boolean), Resolve: func(p graphql.ResolveParams) (interface{}, error) { if todo, ok := p.Source.(*Todo); ok { return todo.Done, nil } return nil, nil }, }, }, }) var queryType = graphql.NewObject(graphql.ObjectConfig{ Name: "Query", Fields: graphql.Fields{ "todos": &graphql.Field{ Type: graphql.NewList(todoType), Resolve: func(p graphql.ResolveParams) (interface{}, error) { return todos, nil }, }, }, }) var schema, _ = graphql.NewSchema(graphql.SchemaConfig{ Query: queryType, }) func main() { http.Handle("/graphql", handler.New(&handler.Config{ Schema: &schema, Pretty: true, })) log.Fatal(http.ListenAndServe(":8080", nil)) }
总结
本文介绍了如何使用 Go 实现 GraphQL API。通过将 GraphQL 和 Go 结合使用,我们可以构建高效、易于维护的数据交换 API。希望这篇文章对你有所帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/658c1123eb4cecbf2d16b35e