😊
Go言語のgqlgenパッケージを使って、GraphQLに入門する
はじめに
Go言語のgalgenパッケージを使って、GraphQLに入門したので、ブログにまとめました。
https://github.com/99designs/gqlgen
のQuick Startを見ながら、プロジェクトの作成からレスポンス取得までの流れを紹介します。
事前準備
1. プロジェクトを作成
ターミナルで以下を入力し、プロジェクトを初期化してください。
mkdir example
cd example
go mod init example
2. gqlgen のインストール
go get github.com/99designs/gqlgen
3. gqlgen の初期設定
以下の通りにtools.goを作成してください。
printf '//go:build tools\npackage tools\nimport (_ "github.com/99designs/gqlgen"\n _ "github.com/99designs/gqlgen/graphql/introspection")' | gofmt > tools.go
go mod tidy
続けて、初期化処理を実行してください。
go run github.com/99designs/gqlgen init
go mod tidy
GraphQL スキーマの確認
ここまでエラーが無ければ、以下のようなスキーマ定義ファイルが自動生成されていると思います。
schema {
query: Query
}
type Query {
hello: String!
users: [User!]!
user(id: ID!): User
}
type User {
id: ID!
name: String!
email: String!
posts: [Post!]!
}
type Post {
id: ID!
title: String!
content: String!
}
gqlgenの自動コード生成
スキーマを定義したら、以下のコマンドでリゾルバの雛形を生成します。
go run github.com/99designs/gqlgen generate
GraphQL サーバーの実装
1. server.goの確認
ここまでエラーが無ければ、server.goが自動生成されていると思います。
server.goは GraphQL サーバーを起動するためのGo プログラムです。
このファイルは、GraphQL APIを実行するためのエントリーポイントになります。
package main
import (
"log"
"net/http"
"os"
"example/graph"
"github.com/99designs/gqlgen/graphql/handler"
"github.com/99designs/gqlgen/graphql/handler/extension"
"github.com/99designs/gqlgen/graphql/handler/lru"
"github.com/99designs/gqlgen/graphql/handler/transport"
"github.com/99designs/gqlgen/graphql/playground"
"github.com/vektah/gqlparser/v2/ast"
)
const defaultPort = "8080"
func main() {
port := os.Getenv("PORT")
if port == "" {
port = defaultPort
}
srv := handler.New(graph.NewExecutableSchema(graph.Config{Resolvers: &graph.Resolver{}}))
srv.AddTransport(transport.Options{})
srv.AddTransport(transport.GET{})
srv.AddTransport(transport.POST{})
srv.SetQueryCache(lru.New[*ast.QueryDocument](1000))
srv.Use(extension.Introspection{})
srv.Use(extension.AutomaticPersistedQuery{
Cache: lru.New[string](100),
})
http.Handle("/", playground.Handler("GraphQL playground", "/query"))
http.Handle("/query", srv)
log.Printf("connect to http://localhost:%s/ for GraphQL playground", port)
log.Fatal(http.ListenAndServe(":"+port, nil))
}
GraphQL のリゾルバを実装
ここまでエラーが無ければ、graph/schema.resolvers.go
が自動生成されていると思います。
このファイルにGraphQLのレスポンスを生成するロジック(リゾルバ)を実装します。
ファイルの中身を以下に丸ごと置き換えてください。
package graph
// This file will be automatically regenerated based on the schema, any resolver implementations
// will be copied through when generating and any unknown code will be moved to the end.
// Code generated by github.com/99designs/gqlgen version v0.17.66
import (
"context"
"fmt"
"example/graph/model"
)
// CreateTodo is the resolver for the createTodo field.
func (r *mutationResolver) CreateTodo(ctx context.Context, input model.NewTodo) (*model.Todo, error) {
panic(fmt.Errorf("not implemented: CreateTodo - createTodo"))
}
// サンプルユーザー
var users = []*model.User{
{ID: "1", Name: "Alice"},
{ID: "2", Name: "Bob"},
}
// サンプル Todo
var todos = []*model.Todo{
{ID: "101", Text: "Alice Todo", Done: false, User: users[0]},
{ID: "102", Text: "Bob Todo", Done: true, User: users[1]},
}
// `todos`のリゾルバ(全てのTodoを取得)
func (r *queryResolver) Todos(ctx context.Context) ([]*model.Todo, error) {
return todos, nil
}
// Mutation returns MutationResolver implementation.
func (r *Resolver) Mutation() MutationResolver { return &mutationResolver{r} }
// Query returns QueryResolver implementation.
func (r *Resolver) Query() QueryResolver { return &queryResolver{r} }
type mutationResolver struct{ *Resolver }
type queryResolver struct{ *Resolver }
動作確認
ターミナルを開き、以下を実行してください。
go run server.go
続けて、ブラウザでhttp://localhost:8080/
にアクセスすると、以下のようなレスポンス動作確認用の画面が開きますので、ピンク色の実行ボタンを押下してください。
押下後、右側にサンプルデータがレスポンスとして表示されます。
おわりに
本記事では、レスポンスを取得する処理までを紹介しました。
別記事で、データの変更操作を行うmutation
について紹介しようと思います。
Discussion