
GraphQL adalah spesifikasi berbasis HTTP yang memecahkan sebagian besar masalah yang akan Anda hadapi saat membangun RESTful API. Ini cocok untuk membangun API yang kompleks karena Anda dapat menggunakan satu titik akhir untuk mengakses data dari banyak skema.
GraphQL mengurangi masalah seperti pengambilan yang berlebihan dan pengambilan yang kurang di REST. Anda dapat membangun klien yang meminta bidang tertentu tanpa harus melakukan panggilan API tambahan.
Ada beberapa paket Go yang dapat Anda manfaatkan untuk membangun aplikasi berbasis GraphQL, mulai dari server hingga API.
1. Paket gqlgen
gqlgen (GraphQL Generator) adalah paket yang kaya fitur dan tipe-safe untuk menghasilkan dan membangun server dan API GraphQL.
Paket gqlgen mengambil pendekatan skema-pertama, di mana Anda menggunakan GraphQL SDL untuk mendefinisikan skema Anda. Ini kemudian menghasilkan kode boilerplate yang dapat Anda sesuaikan untuk menyiapkan server dan API GraphQL Anda.
gqlgen adalah salah satu paket GraphQL yang lebih lengkap di ekosistem Go. Anda dapat membuat dokumentasi dan contoh dengan paket dan membuat kueri, mutasi, dan langganan.
gqlgen memastikan pengikatan jenis, penyematan, antarmuka, input yang dihasilkan, dan enum. Paket ini juga menyediakan fungsionalitas untuk penelusuran terbuka, kait untuk pencatatan kesalahan, pemuatan data, konkurensi, dan peningkatan kompleksitas kueri.
Setelah mendefinisikan skema GraphQL Anda—seperti yang Anda lakukan dengan pustaka skema pertama—Anda akan menggunakan aplikasi baris perintah gqlgen untuk menghasilkan kode boilerplate dari skema di proyek Anda.
Membuat tools.go file di direktori kerja Anda dan tambahkan baris kode ini untuk memasukkan gqlgen kemasan:
package tools
import _ "github.com/99designs/gqlgen"
Itu tools.go file menentukan alat build untuk gqlgen kemasan.
Jalankan perintah ini di direktori kerja Anda untuk menginstal paket gqlgen dan dependensinya:
go install github.com/99designs/gqlgen@latest
go mod tidy
Anda dapat menginisialisasi proyek GraphQL baru ketika Anda menjalankan paket GraphQL dengan init perintah sebagai argumen:
go run github.com/99designs/gqlgen init
Anda harus memiliki skema Anda di a schema.graphql file yang terletak di direktori kerja Anda untuk menginisialisasi proyek.
Jalankan server.go file untuk memulai server GraphQL Anda setelah menambahkan fungsionalitas ke aplikasi GraphQL Anda:
go run server.go
2. Paket graphql-go
Paket graphql-go adalah perpustakaan GraphQL populer yang bertujuan untuk menyediakan yang lengkap Spesifikasi draf GraphQL untuk membangun layanan GraphQL di Go.
Paket graphql-go menggunakan pendekatan tipe runtime; Anda memiliki opsi untuk mendeklarasikan skema Anda dalam kode Go, dan paket akan memeriksa waktu proses.
Anda dapat menerapkan kueri, mutasi, dan langganan serta membuat contoh dengan paket, tetapi tidak ada fungsi untuk enum, input, atau penelusuran terbuka yang dihasilkan.
graphql-go memiliki API minimal dengan dukungan untuk paket bawaan dan paket pihak ketiga yang populer. Ini memiliki dukungan untuk OpenTelemetri dan Pelacakan Terbuka standar, pemeriksaan tipe skema terhadap resolver, eksekusi resolver paralel, dan banyak fitur lainnya.
Jika Anda akrab dengan membangun layanan RESTful di Go dengan http kemasan, Anda akan menemukan paket graphql-go mudah digunakan.
Jalankan perintah ini di direktori kerja Anda untuk menambahkan paket graphql-go dan dependensinya ke proyek Anda:
go get github.com/graph-gophers/graphql-go
Berikut adalah contoh memulai server GraphQL sederhana:
package mainimport (
"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))
}
Itu Halo metode pertanyaan struct adalah resolver untuk titik akhir GraphQL yang mengembalikan hello world. Itu skemaContoh variabel adalah definisi skema, dan server akan berjalan pada port 8080 dengan http paket DengarkanDanLayani metode.
3. Paket Guntur
Itu Guruh framework mengambil pendekatan struct pertama; Anda mendeklarasikan struct yang memodelkan skema GraphQL Anda. Ini menghasilkan Skema GraphQL dari data Go untuk menangani pengelompokan kueri, kueri langsung, mutasi, langganan, dan pembuatan contoh.
Thunder menyediakan keamanan tipe dengan binding tipe dan fitur lainnya, termasuk pembuatan skema berbasis refleksi, eksekusi dan batching paralel bawaan, editor GraphiQL bawaan, dan skema split untuk server GraphQL yang lebih besar.
Tidak ada fungsi untuk penyematan, antarmuka, enum atau input yang dihasilkan, federasi, pelacakan terbuka, atau kesalahan khusus dalam paket Thunder. Namun, ini adalah salah satu yang paling mudah digunakan dibandingkan dengan paket populer lainnya dan merupakan paket awal yang sangat baik jika Anda tidak memiliki pengalaman GraphQL.
Anda harus menjalankan perintah ini di terminal direktori kerja Anda untuk menginstal paket Thunder dan dependensinya:
go get github.com/samsarahq/thunder/graphql
Anda harus mendeklarasikan model struct untuk skema, menulis resolver, dan membuat instance server untuk memulai server GraphQL sederhana dengan paket Thunder.
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
}
type server struct {
posts []post
}
func (s *server) registerQuery(schema *schemabuilder.Schema) {
obj := schema.Query()
obj.FieldFunc("posts", func() []post {
return s.posts
})
}
func (s *server) registerMutation(schema *schemabuilder.Schema) {
obj := schema.Mutation()
obj.FieldFunc("echo", func(args struct{ Message string }) string {
return args.Message
})
}
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()
})
}
func (s *server) schema() *graphql.Schema {
builder := schemabuilder.NewSchema()
s.registerQuery(builder)
s.registerMutation(builder)
s.registerPost(builder)
return builder.MustBuild()
}
func main() {
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)
http.Handle("/graphql", graphql.Handler(schema))
http.Handle("/graphiql/", http.StripPrefix("/graphiql/", graphiql.Handler()))
http.ListenAndServe(":3030", nil)
}
Itu pos struct adalah model untuk skema GraphQL, dan server struct adalah contoh server. Itu daftarPermintaan, daftarMutasidan daftarPoskan metode adalah fungsi resolver untuk kueri, mutasi, dan penyimpanan data.
Itu utama fungsi dimulai dengan server GraphQL pada port 3030 dan editor GraphQL.
Anda Dapat Membuat Kueri GraphQL API di Go Dengan Paket Bawaan
GraphQL berbasis HTTP, dan Anda dapat menggunakan GraphQL API dengan built-in http package dan paket lain yang mirip dengan RESTful API. Ada juga paket di ekosistem Go yang memungkinkan Anda menggunakan GraphQL API dengan cepat.