3 пакета GraphQL на основе Go для вашего следующего API
Программирование

3 пакета GraphQL на основе Go для вашего следующего API

Освойте язык 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

Об авторе

Алексей Белоусов

Привет, меня зовут Филипп. Я фрилансер энтузиаст . В свободное время занимаюсь переводом статей и пишу о потребительских технологиях для широкого круга изданий , не переставая питать большую страсть ко всему мобильному =)

Комментировать

Оставить комментарий