Освойте язык GraphQL с помощью Go и этих удобных пакетов
GraphQL – это спецификация на основе HTTP, которая решает большинство проблем, возникающих при создании RESTful API. Она подходит для создания сложных API, поскольку вы можете использовать одну конечную точку для доступа к данным из многих схем
GraphQL смягчает такие проблемы, как избыточная и недостаточная выборка данных в REST. Вы можете создать клиент, который запрашивает определенные поля без необходимости делать дополнительные вызовы API
Существует несколько пакетов Go, которыми можно воспользоваться для создания приложений на основе GraphQL, от серверов до API
1. Пакет gqlgen
gqlgen (GraphQL Generator) – это многофункциональный, безопасный для типов пакет для генерации и создания GraphQL-серверов и API
Пакет gqlgen использует подход схема-первый, при котором вы используете GraphQL SDL для определения вашей схемы. Затем он генерирует шаблонный код, который вы можете настроить для создания вашего сервера GraphQL и API
gqlgen – один из наиболее полных пакетов GraphQL в экосистеме Go. С помощью пакета можно генерировать документацию и примеры, создавать запросы, мутации и подписки
gqlgen обеспечивает привязку типов, встраивание, интерфейсы, генерируемые входы и перечисления. Пакет также предоставляет функциональность для открытой трассировки, крючки для регистрации ошибок, загрузки данных, параллелизма и повышенной сложности запросов
После определения схемы GraphQL— как и в любой другой библиотеке, основанной на схеме— вы будете использовать приложение командной строки gqlgen для генерации шаблонного кода на основе схемы в вашем проекте
Создайте файл tools.go в своем рабочем каталоге и добавьте эти строки кода, чтобы включить пакет gqlgen:
// +build tools
package tools
import _ 'github.com/99designs/gqlgen'
Файл tools.go определяет инструменты сборки для пакета gqlgen
Выполните эти команды в своем рабочем каталоге для установки пакета gqlgen и его зависимостей:
go install github.com/99designs/gqlgen@latest
go mod tidy
Вы можете инициализировать новый проект GraphQL при запуске пакета GraphQL с командой init в качестве аргумента:
go run github.com/99designs/gqlgen init
Для инициализации проекта вам понадобится схема в файле schema.graphql, расположенном в вашем рабочем каталоге
Запустите файл server.go, чтобы запустить ваш сервер GraphQL после добавления функциональности в ваше приложение GraphQL:
go run server.go
2. Пакет graphql-go
Пакет graphql-go – это популярная библиотека GraphQL, целью которой является предоставление полной черновой спецификации GraphQL для создания сервисов GraphQL на Go
Пакет graphql-go использует подход с использованием типов времени выполнения; у вас есть возможность объявить свою схему в коде Go, а пакет проверяет ее во время выполнения
Вы можете реализовать запросы, мутации и подписки и генерировать примеры с помощью пакета, но в нем нет функциональности для генерируемых перечислений, входов или открытой трассировки
graphql-go имеет минимальный API с поддержкой как встроенных пакетов, так и популярных пакетов сторонних разработчиков. В нем есть поддержка стандартов OpenTelemetry и OpenTracing, проверка типов схем в резолверах, параллельное выполнение резолверов и многие другие возможности
Если вы знакомы с построением RESTful-сервисов в Go с помощью пакета http, вы найдете пакет graphql-go простым в использовании
Выполните эти команды в своем рабочем каталоге, чтобы добавить пакет graphql-go и его зависимости в свой проект:
go get github.com/graph-gophers/graphql-go
Вот пример запуска простого сервера GraphQL:
package main
import (
'log'
'net/http'
graphql 'github.com/graph-gophers/graphql-go'
'github.com/graph-gophers/graphql-go/relay'
)
type query struct{}
func (_ *query) Hello() string { return 'Hello, world!' }
func main() {
schemaExample := `
type Query {
hello: String!
}
`
schema := graphql.MustParseSchema(schemaExample, &query{})
http.Handle('/query', &relay.Handler{Schema: schema})
log.Fatal(http.ListenAndServe(':8080', nil))
}
Метод Hello структуры запроса является резольвером для конечной точки GraphQL, которая возвращает hello world. Переменная schemaExample – это определение схемы, а сервер будет запущен на порту 8080 с помощью метода ListenAndServe пакета http
3. Пакет Thunder
Фреймворк Thunder использует подход struct first; вы объявляете struct, который моделирует вашу схему GraphQL. Он генерирует схему GraphQL из данных Go для обработки пакетных запросов, живых запросов, мутаций, подписок и генерации примеров
Thunder обеспечивает безопасность типов с помощью привязок типов и другие возможности, включая построение схем на основе отражения, встроенное параллельное выполнение и пакетную обработку, встроенный редактор GraphiQL и разделение схем для больших серверов GraphQL
В пакете Thunder нет функциональности для встраивания, интерфейсов, генерируемых перечислений или входов, федерации, открытой трассировки или пользовательских ошибок. Однако он один из самых простых в использовании по сравнению с другими популярными пакетами и является отличным стартовым пакетом, если у вас нет опыта работы с GraphQL
Вам нужно будет выполнить эту команду в терминале вашего рабочего каталога, чтобы установить пакет Thunder и его зависимости:
go get github.com/samsarahq/thunder/graphql
Чтобы запустить простой GraphQL-сервер с помощью пакета Thunder, вам нужно будет объявить struct-модель для схемы, написать резольверы и инстанцировать сервер
import (
'context'
'net/http'
'time'
'github.com/samsarahq/thunder/graphql'
'github.com/samsarahq/thunder/graphql/graphiql'
'github.com/samsarahq/thunder/graphql/introspection'
'github.com/samsarahq/thunder/graphql/schemabuilder'
'github.com/samsarahq/thunder/reactive'
)
type post struct {
Title string
Body string
CreatedAt time.Time
}
// server is our graphql server.
type server struct {
posts []post
}
// registerQuery registers the root query type.
func (s *server) registerQuery(schema *schemabuilder.Schema) {
obj := schema.Query()
obj.FieldFunc('posts', func() []post {
return s.posts
})
}
// registerMutation registers the root mutation type.
func (s *server) registerMutation(schema *schemabuilder.Schema) {
obj := schema.Mutation()
obj.FieldFunc('echo', func(args struct{ Message string }) string {
return args.Message
})
}
// registerPost registers the post type.
func (s *server) registerPost(schema *schemabuilder.Schema) {
obj := schema.Object('Post', post{})
obj.FieldFunc('age', func(ctx context.Context, p *post) string {
reactive.InvalidateAfter(ctx, 5*time.Second)
return time.Since(p.CreatedAt).String()
})
}
// schema builds the graphql schema.
func (s *server) schema() *graphql.Schema {
builder := schemabuilder.NewSchema()
s.registerQuery(builder)
s.registerMutation(builder)
s.registerPost(builder)
return builder.MustBuild()
}
func main() {
// Instantiate a server, build a server, and serve the schema on port 3030.
server := &server{
posts: []post{
{Title: 'first post!', Body: 'I was here first!', CreatedAt: time.Now()},
{Title: 'graphql', Body: 'did you hear about Thunder?', CreatedAt: time.Now()},
},
}
schema := server.schema()
introspection.AddIntrospectionToSchema(schema)
// Expose schema and graphiql.
http.Handle('/graphql', graphql.Handler(schema))
http.Handle('/graphiql/', http.StripPrefix('/graphiql/', graphiql.Handler()))
http.ListenAndServe(':3030', nil)
}
Структура post является моделью для схемы GraphQL, а структура server – экземпляром сервера. Методы registerQuery, registerMutation и registerPost – это функции резольвера для запросов, мутаций и хранения данных
Основная функция начинается с сервера GraphQL на порту 3030 и редактора GraphQL
Вы можете запрашивать API GraphQL в Go с помощью встроенных пакетов
GraphQL основан на HTTP, и вы можете использовать API GraphQL с помощью встроенного пакета http и других пакетов, аналогичных RESTful API. В экосистеме Go также есть пакеты, которые позволят вам быстро использовать API GraphQL
Комментировать