GraphQL, RESTful API’leri oluştururken karşılaşacağınız sorunların çoğunu çözen HTTP tabanlı bir belirtimdir. Birçok şemadan verilere erişmek için tek bir uç nokta kullanabileceğiniz için karmaşık API’ler oluşturmak için uygundur.
GraphQL, REST’te aşırı getirme ve eksik getirme gibi sorunları azaltır. Ek API çağrıları yapmak zorunda kalmadan belirli alanlar isteyen bir istemci oluşturabilirsiniz.
Sunuculardan API’lere kadar GraphQL tabanlı uygulamalar oluşturmak için yararlanabileceğiniz birkaç Go paketi vardır.
1. gqlgen Paketi
gqlgen (GraphQL Generator) , GraphQL sunucuları ve API’leri oluşturmak ve oluşturmak için zengin özelliklere sahip, tür açısından güvenli bir pakettir.
gqlgen paketi, şemanızı tanımlamak için GraphQL SDL’yi kullandığınız şema öncelikli bir yaklaşımı benimser. Ardından, GraphQL sunucunuzu ve API’nizi ayarlamak için ayarlayabileceğiniz ortak kodu oluşturur.
gqlgen, Go ekosistemindeki daha eksiksiz GraphQL paketlerinden biridir . Paketle belgeler ve örnekler oluşturabilir ve sorgular, mutasyonlar ve abonelikler oluşturabilirsiniz.
gqlgen, tür bağlamaları, yerleştirmeler, arabirimler, oluşturulan girdiler ve numaralandırmalar sağlar. Paket ayrıca açık izleme için işlevsellik, hata günlüğü için kancalar, veri yükleme, eşzamanlılık ve artan sorgu karmaşıklığı sağlar.
GraphQL şemanızı tanımladıktan sonra – herhangi bir şema öncelikli kitaplıkta yapacağınız gibi – projenizdeki şemadan ortak kod oluşturmak için gqlgen komut satırı uygulamasını kullanacaksınız.
Çalışma dizininizde bir tools.go dosyası oluşturun ve gqlgen paketini dahil etmek için şu kod satırlarını ekleyin:
// +build tools
package tools
import _ “github.com/99designs/gqlgen”
Tools.go dosyası, gqlgen paketi için derleme araçlarını belirtir .
gqlgen paketini ve bağımlılıklarını kurmak için çalışma dizininizde bu komutları çalıştırın:
go install github.com/99designs/gqlgen@latest
go mod tidy
GraphQL paketini argüman olarak init komutuyla çalıştırdığınızda yeni bir GraphQL projesini başlatabilirsiniz:
go run github.com/99designs/gqlgen init
Bir projeyi başlatmak için çalışma dizininizde bulunan bir schema.graphql dosyasında şemanızın olması gerekir.
GraphQL uygulamanıza işlevsellik ekledikten sonra GraphQL sunucunuzu başlatmak için server.go dosyasını çalıştırın :
go run server.go
2. graphql-go Paketi
graphql-go paketi , Go’da GraphQL hizmetleri oluşturmak için eksiksiz GraphQL taslak belirtimini sağlamayı amaçlayan popüler bir GraphQL kitaplığıdır .
graphql-go paketi, çalışma zamanı türleri yaklaşımını benimser; şemanızı Go kodunda bildirme seçeneğiniz vardır ve paket çalışma zamanında kontrol eder.
Paketle birlikte sorgular, mutasyonlar ve abonelikler uygulayabilir ve örnekler oluşturabilirsiniz, ancak oluşturulan numaralandırmalar, girdiler veya açık izleme için işlevsellik yoktur.
graphql-go, hem yerleşik paketleri hem de popüler üçüncü taraf paketlerini destekleyen minimal bir API’ye sahiptir. OpenTelemetry ve OpenTracing standartları, çözümleyicilere karşı şema türü denetimi, çözümleyicilerin paralel yürütülmesi ve diğer birçok özelliği destekler.
Go’da http paketiyle RESTful hizmetleri oluşturmaya aşinaysanız, graphql -go paketinin kullanımını kolay bulacaksınız.
Grafql-go paketini ve bağımlılıklarını projenize eklemek için çalışma dizininizde bu komutları çalıştırın:
go get github.com/graph-gophers/graphql-go
İşte basit bir GraphQL sunucusu başlatma örneği:
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))
}
Sorgu yapısının Hello yöntemi, merhaba dünyayı döndüren GraphQL uç noktası için bir çözümleyicidir. schemaExample değişkeni şema tanımıdır ve sunucu, http paketinin ListenAndServe yöntemiyle 8080 numaralı bağlantı noktasında çalışır .
3. Gök Gürültüsü Paketi
Thunder çerçevesi yapı ilk yaklaşımını benimser ; GraphQL şemanızı modelleyen bir yapı ilan edersiniz. Sorgu toplu işleme, canlı sorgular, mutasyonlar, abonelikler ve örnek oluşturma işlemlerini işlemek için Go verilerinden GraphQL şeması oluşturur .
Thunder, tür bağlamaları ve yansıma tabanlı şema oluşturma, yerleşik paralel yürütme ve gruplama, yerleşik bir GraphiQL düzenleyici ve daha büyük GraphQL sunucuları için bölünmüş şemalar dahil olmak üzere diğer özelliklerle tür güvenliği sağlar.
Thunder paketinde gömme, arabirimler, oluşturulan numaralandırmalar veya girişler, federasyon, açık izleme veya özel hatalar için herhangi bir işlevsellik yoktur. Ancak, diğer popüler paketlere kıyasla kullanımı en kolay olanlardan biridir ve GraphQL deneyiminiz yoksa mükemmel bir başlangıç paketidir.
Thunder paketini ve bağımlılıklarını kurmak için çalışma dizininizin terminalinde bu komutu çalıştırmanız gerekecek:
go get github.com/samsarahq/thunder/graphql
Şema için bir yapı modeli tanımlamanız, çözümleyicileri yazmanız ve Thunder paketiyle basit bir GraphQL sunucusu başlatmak için sunucuyu başlatmanız gerekir.
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 yapısı, GraphQL şemasının modelidir ve sunucu yapısı, sunucu örneğidir. registerQuery , registerMutation ve registerPost yöntemleri , sorgular, mutasyonlar ve veri depolama için çözümleyici işlevlerdir.
Ana işlev, 3030 numaralı bağlantı noktasındaki GraphQL sunucusu ve GraphQL düzenleyicisi ile başlar.
Yerleşik Paketlerle Go In Go In GraphQL API’lerini Sorgulayabilirsiniz
GraphQL, HTTP tabanlıdır ve yerleşik http paketi ve RESTful API’lerine benzer diğer paketlerle GraphQL API’lerini kullanabilirsiniz. Go’nun ekosisteminde, GraphQL API’lerini hızlı bir şekilde tüketmenizi sağlayacak paketler de bulunmaktadır.