با استفاده از Go و این بسته های مفید به زبان GraphQL مسلط شوید.
GraphQL یک مشخصات مبتنی بر HTTP است که بسیاری از مشکلاتی را که هنگام ساختن API های RESTful با آن مواجه می شوید، حل می کند. برای ساخت API های پیچیده مناسب است زیرا می توانید از یک نقطه پایانی برای دسترسی به داده های بسیاری از طرحواره ها استفاده کنید.
GraphQL مسائلی مانند واکشی بیش از حد و کم واکشی را در REST کاهش می دهد. شما می توانید یک کلاینت بسازید که فیلدهای خاصی را بدون نیاز به برقراری تماس های API اضافی درخواست کند.
چندین بسته Go وجود دارد که می توانید از آنها برای ساخت برنامه های مبتنی بر GraphQL، از سرورها گرفته تا API ها، استفاده کنید.
1. بسته gqlgen
gqlgen (GraphQL Generator) بسته ای غنی از ویژگی و نوع ایمن برای تولید و ساخت سرورها و API های GraphQL است.
بسته gqlgen یک رویکرد schema-first را اتخاذ میکند، که توسط آن از GraphQL SDL برای تعریف طرحواره خود استفاده میکنید. سپس کد boilerplate را تولید می کند که می توانید آن را برای تنظیم سرور GraphQL و API خود تنظیم کنید.
gqlgen یکی از کاملترین بستههای GraphQL در اکوسیستم Go است. می توانید مستندات و نمونه هایی را با بسته ایجاد کنید و پرس و جوها، جهش ها و اشتراک ها را ایجاد کنید.
gqlgen اتصالهای نوع، تعبیهها، رابطها، ورودیهای تولید شده و enumها را تضمین میکند. این بسته همچنین قابلیتهایی را برای ردیابی باز، قلابهایی برای ثبت خطا، بارگذاری دادهها، همزمانی و افزایش پیچیدگی پرس و جو ارائه میکند.
پس از تعریف طرح GraphQL خود – همانطور که با هر کتابخانه schema-first انجام می دهید – از برنامه خط فرمان gqlgen برای تولید کد boilerplate از طرح در پروژه خود استفاده خواهید کرد.
یک فایل 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 را با دستور init به عنوان آرگومان اجرا می کنید، می توانید یک پروژه GraphQL جدید را مقداردهی اولیه کنید:
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 اعلام کنید و بسته در زمان اجرا بررسی می کند.
میتوانید کوئریها، جهشها و اشتراکها را پیادهسازی کنید و نمونههایی را با بسته تولید کنید، اما هیچ عملکردی برای enums، ورودیها یا ردیابی باز تولید شده وجود ندارد.
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 ساختار query یک حلکننده برای نقطه پایانی GraphQL است که hello world را برمیگرداند. متغیر schemaExample تعریف طرحواره است و سرور بر روی پورت 8080 با روش ListenAndServe بسته http اجرا می شود.
3. پکیج تندر
چارچوب Thunder رویکرد اول ساختار را اتخاذ می کند. شما ساختاری را اعلام می کنید که طرحواره GraphQL شما را مدل می کند. این طرحواره GraphQL را از داده های Go تولید می کند تا دسته بندی پرس و جو، پرس و جوهای زنده، جهش ها، اشتراک ها و تولید نمونه را مدیریت کند.
Thunder ایمنی نوع را با اتصالهای نوع و سایر ویژگیها، از جمله ساخت طرحواره مبتنی بر بازتاب، اجرای موازی داخلی و دستهبندی، ویرایشگر GraphiQL داخلی، و طرحهای تقسیمشده برای سرورهای GraphQL بزرگتر، فراهم میکند.
هیچ عملکردی برای جاسازی، رابطها، شمارهها یا ورودیهای تولید شده، فدراسیونبندی، ردیابی باز یا خطاهای سفارشی در بسته Thunder وجود ندارد. با این حال، در مقایسه با سایر بستههای محبوب، یکی از سادهترین روشها برای استفاده است و اگر تجربهای در GraphQL ندارید، یک بسته شروع عالی است.
برای نصب بسته Thunder و وابستگی های آن باید این دستور را در ترمینال دایرکتوری کاری خود اجرا کنید:
go get github.com/samsarahq/thunder/graphql
شما باید یک مدل ساختاری برای طرحواره اعلام کنید، حلکنندهها را بنویسید و سرور را برای راهاندازی یک سرور GraphQL ساده با پکیج 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
}
// 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)
}
ساختار پست مدل طرحواره GraphQL است و ساختار سرور نمونه سرور است. متدهای registerQuery، registerMutation و registerPost توابع حلکنندهای برای کوئریها، جهشها و ذخیرهسازی دادهها هستند.
عملکرد اصلی با سرور GraphQL در پورت 3030 و ویرایشگر GraphQL شروع می شود.
میتوانید با بستههای داخلی، APIهای GraphQL را در Go جستجو کنید
GraphQL مبتنی بر HTTP است و میتوانید APIهای GraphQL را با بسته http داخلی و سایر بستههای مشابه RESTful API مصرف کنید. همچنین بسته هایی در اکوسیستم Go وجود دارد که به شما امکان می دهد API های GraphQL را به سرعت مصرف کنید.