/ / 3 Gói GraphQL dựa trên Go cho API tiếp theo của bạn

3 Gói GraphQL dựa trên Go cho API tiếp theo của bạn

GraphQL là một đặc tả dựa trên HTTP giải quyết hầu hết các vấn đề bạn sẽ gặp phải khi xây dựng các API RESTful. Nó phù hợp để xây dựng các API phức tạp vì bạn có thể sử dụng một điểm cuối để truy cập dữ liệu từ nhiều lược đồ.


GraphQL giảm thiểu các vấn đề như tìm nạp quá mức và tìm nạp dưới mức trong REST. Bạn có thể tạo một ứng dụng khách yêu cầu các trường cụ thể mà không cần phải thực hiện các lệnh gọi API bổ sung.

Có một số gói Go mà bạn có thể tận dụng để xây dựng các ứng dụng dựa trên GraphQL, từ máy chủ đến API.


1. Gói gqlgen

gqlgen GitHub Xem trước

gqlgen (GraphQL Generator) là một gói loại an toàn, giàu tính năng để tạo và xây dựng các máy chủ và API GraphQL.

Gói gqlgen sử dụng phương pháp tiếp cận lược đồ ưu tiên, theo đó bạn sử dụng GraphQL SDL để xác định lược đồ của mình. Sau đó, nó tạo ra mã soạn sẵn mà bạn có thể điều chỉnh để thiết lập máy chủ GraphQL và API của mình.

gqlgen là một trong những gói GraphQL hoàn chỉnh hơn trong hệ sinh thái Go. Bạn có thể tạo tài liệu và ví dụ với gói và tạo truy vấn, đột biến và đăng ký.

gqlgen đảm bảo ràng buộc kiểu, nhúng, giao diện, đầu vào được tạo và enums. Gói này cũng cung cấp chức năng truy tìm mở, móc để ghi lỗi, tải dữ liệu, đồng thời và tăng độ phức tạp của truy vấn.

Sau khi xác định lược đồ GraphQL của bạn — như bạn làm với bất kỳ thư viện đầu tiên của lược đồ nào — bạn sẽ sử dụng ứng dụng dòng lệnh gqlgen để tạo mã bảng soạn sẵn từ lược đồ trong dự án của mình.

Tạo một tools.go tệp trong thư mục làm việc của bạn và thêm các dòng mã này để bao gồm gqlgen bưu kiện:

package tools

import _ "github.com/99designs/gqlgen"

Các tools.go tệp chỉ định các công cụ xây dựng cho gqlgen bưu kiện.

Chạy các lệnh này trong thư mục làm việc của bạn để cài đặt gói gqlgen và các gói phụ thuộc của nó:

go install github.com/99designs/gqlgen@latest
go mod tidy

Bạn có thể khởi tạo một dự án GraphQL mới khi bạn chạy gói GraphQL với trong đó lệnh như một đối số:

go run github.com/99designs/gqlgen init

Bạn sẽ cần có lược đồ của mình trong một schema.graphql tệp nằm trong thư mục làm việc của bạn để khởi tạo một dự án.

Chạy server.go tệp để khởi động máy chủ GraphQL của bạn sau khi thêm chức năng vào ứng dụng GraphQL của bạn:

go run server.go

2. Gói graphql-go

Bản xem trước gói Graphql-go

Gói graphql-go là một thư viện GraphQL phổ biến nhằm mục đích cung cấp đặc tả dự thảo GraphQL hoàn chỉnh để xây dựng các dịch vụ GraphQL trong Go.

Gói graphql-go sử dụng cách tiếp cận kiểu thời gian chạy; bạn có tùy chọn khai báo lược đồ của mình trong mã Go và gói kiểm tra trong thời gian chạy.

Bạn có thể triển khai các truy vấn, đột biến và đăng ký và tạo các ví dụ với gói, nhưng không có chức năng nào cho các enums, đầu vào hoặc theo dõi mở đã tạo.

graphql-go có một API tối thiểu với sự hỗ trợ cho cả các gói tích hợp sẵn và các gói phổ biến của bên thứ ba. Nó hỗ trợ cho OpenTelemetryOpenTracing tiêu chuẩn, kiểm tra kiểu lược đồ đối với các trình phân giải, thực thi song song các trình phân giải và nhiều tính năng khác.

Nếu bạn đã quen với việc xây dựng các dịch vụ RESTful trong Go with the http bạn sẽ thấy gói graphql-go dễ sử dụng.

Chạy các lệnh này trong thư mục làm việc của bạn để thêm gói graphql-go và các phần phụ thuộc của nó vào dự án của bạn:

go get github.com/graph-gophers/graphql-go

Dưới đây là một ví dụ về việc khởi động một máy chủ GraphQL đơn giản:

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))
}

Các Xin chào phương pháp của truy vấn struct là một trình phân giải cho điểm cuối GraphQL trả về hello world. Các schemaExample biến là định nghĩa giản đồ và máy chủ sẽ chạy trên cổng 8080 với http gói của ListenAndServe phương pháp.

3. Gói Sấm sét

gói sấm sét Xem trước GitHub

Khung công tác Thunder sử dụng cách tiếp cận đầu tiên về cấu trúc; bạn khai báo một cấu trúc mô hình hóa lược đồ GraphQL của bạn. Nó tạo lược đồ GraphQL từ dữ liệu Go để xử lý nhóm truy vấn, truy vấn trực tiếp, đột biến, đăng ký và tạo ví dụ.

Thunder cung cấp sự an toàn cho kiểu với các ràng buộc kiểu và các tính năng khác, bao gồm xây dựng lược đồ dựa trên phản xạ, thực thi và phân phối song song được tích hợp sẵn, trình soạn thảo GraphiQL tích hợp sẵn và các lược đồ phân chia cho các máy chủ GraphQL lớn hơn.

Không có chức năng nhúng, giao diện, enum hoặc đầu vào được tạo, liên kết, truy tìm mở hoặc lỗi tùy chỉnh trong gói Thunder. Tuy nhiên, nó là một trong những gói dễ sử dụng nhất so với các gói phổ biến khác và là một gói khởi đầu tuyệt vời nếu bạn chưa có kinh nghiệm về GraphQL.

Bạn sẽ cần chạy lệnh này trong phần cuối của thư mục làm việc để cài đặt gói Thunder và các phần phụ thuộc của nó:

go get github.com/samsarahq/thunder/graphql

Bạn sẽ cần phải khai báo một mô hình cấu trúc cho lược đồ, viết các trình phân giải và khởi tạo máy chủ để khởi động một máy chủ GraphQL đơn giản với gói 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)
}

Các bưu kiện struct là mô hình cho lược đồ GraphQL và người phục vụ struct là phiên bản máy chủ. Các registerQuery, registerMutationregisterPost các phương thức là các hàm phân giải cho các truy vấn, đột biến và lưu trữ dữ liệu.

Các chính chức năng bắt đầu với máy chủ GraphQL trên cổng 3030 và trình soạn thảo GraphQL.

Bạn có thể truy vấn các API GraphQL ngay lập tức với các gói tích hợp

GraphQL dựa trên HTTP và bạn có thể sử dụng các API GraphQL với phần mềm tích hợp sẵn http gói và các gói khác tương tự như API RESTful. Ngoài ra còn có các gói trong hệ sinh thái của Go sẽ cho phép bạn sử dụng các API GraphQL một cách nhanh chóng.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *