آموزش کار با GraphQL در گولنگ

GraphQL در گولنگ ابزاری قدرتمند برای ساخت APIهای مدرن و انعطاف‌پذیر است. برای استفاده از GraphQL در گولنگ معمولاً از کتابخانه محبوب gqlgen استفاده می‌شود که امکان تعریف ساختار API به‌صورت schema-first را فراهم می‌کند. در این فرآیند، ابتدا فایل schema.graphqls شامل نوع داده‌ها و query/mutationها نوشته می‌شود، سپس gqlgen به‌طور خودکار کدهای لازم را تولید می‌کند و شما تنها نیاز دارید منطق مربوط به هر resolver را پیاده‌سازی کنید. نتیجه کار یک API ساختاریافته، سریع و قابل توسعه خواهد بود که به‌سادگی می‌توانید آن را با کلاینت‌هایی مثل React یا Postman تست کنید.


1. نصب gqlgen

ابتدا باید gglgen نصب کنید:

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

پس از نصب پکیج، در پروژه خودتون دستور زیر بزنید تا در پروژه پکیج اضافه بشه:

go get github.com/99designs/gqlgen


2. راه اندازی gqlgen

دستور زیر در روت پروژه اجرا کنید. این دستور فایل های مخصوص پکیج رو تولید میکنه تا بتونید از پکیج در پروژه استفاده کنید:

gqlgen init


3. اضافه کردن Schema

در پوشه graph یک فایل به نام book.graphqls ایجاد کنید تا بتونیم Schema های GraphQL بسازیم:

type Book {
    id: ID!
    title: String!
    author: String!
}

type Query {
    allBooks: [Book!]!
    book(id: ID!): Book
}

type Mutation {
    createBook(title: String!, author: String!): Book
}


4. تولید کد برای GraphQL

برای تولید کد نیاز داریم که کامند زیر اجرا کنیم تا کد های مربوط به GraphQL ساخته بشن:

gqlgen

با اجرا این کد:

  • فایل model/models_gen.go ساخته یا آپدیت میشه.
  • فایل generated.go آپدیت میشه تا با Schema ها هماهنگ بشه.
  • فایل resolver.go آپدیت میشه.


5. پیاده سازی Resolver

برای اضافه کردن Query و Mutation ها شما نیاز دارید که در فایل resolver.go، پیاده سازی خودتون انجام بدید:

package graph

import "github.com/sanda0/graphql_example/graph/model"

// Resolver struct to hold data
type Resolver struct {
 books []*model.Book
}

با دستور gqlgen فایل book.resolvers.go ساخته میشه، حالا درونش باید اون عملیات اصلی پیاده سازی کنیم:

package graph

import (
    "context"
    "fmt"
    "math/rand"
    "strconv"

    "github.com/milwad-dev/gograph/graph/model"
)

// CreateBook is the resolver for the createBook field.
func (r *mutationResolver) CreateBook(ctx context.Context, title string, author string) (*model.Book, error) {
    book := &model.Book{
       ID:     strconv.Itoa(rand.Intn(1000)),
       Title:  title,
       Author: author,
    }
    r.books = append(r.books, book)
    return book, nil
}

// AllBooks is the resolver for the allBooks field.
func (r *queryResolver) AllBooks(ctx context.Context) ([]*model.Book, error) {
    return r.books, nil
}

// Book is the resolver for the book field.
func (r *queryResolver) Book(ctx context.Context, id string) (*model.Book, error) {
    for _, book := range r.books {
       if book.ID == id {
          return book, nil
       }
    }
    return nil, fmt.Errorf("book not found")
}

// Mutation returns MutationResolver implementation.
func (r *Resolver) Mutation() MutationResolver { return &mutationResolver{r} }

// Query returns QueryResolver implementation.
func (r *Resolver) Query() QueryResolver { return &queryResolver{r} }

type mutationResolver struct{ *Resolver }
type queryResolver struct{ *Resolver }


6. راه اندازی سرور

برای اینکه سرور GraphQL بخواهید راه بندازید، باید توی فایل main.go سرور راه اندازی کنید:

package main

import (
    "log"
    "net/http"

    "github.com/99designs/gqlgen/graphql/handler"
    "github.com/99designs/gqlgen/graphql/playground"
    "github.com/milwad-dev/gograph/graph"
)

func main() {

    // Set up GraphQL server
    srv := handler.NewDefaultServer(graph.NewExecutableSchema(graph.Config{Resolvers: &graph.Resolver{}}))

    // Handlers
    http.Handle("/", playground.Handler("GraphQL Playground", "/query"))
    http.Handle("/query", srv)

    // Start server
    log.Println("Server is running on http://localhost:8080/")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

بعد با دستور زیر اپلیکیشن اجرا کنید:

go run main.go

بعد از اجرا شما در مسیر http://localhost:8080 میتونید از GraphQL استفاده کنید:

0 🔥
0 🎉
0 😮
0 👍
0 💜
0 👏
میلاد خسروی
نویسنده کد نیوز

برنامه نویس فان | Fun Developer یک آدم ساده که عاشق برنامه نویسی و کد زدنه :) تلاش میکنه تا به بقیه کمک کنه. توسعه دهنده هسته لاراول و فضای اوپن سورس. فاندر پرانتز و کد نیوز.

0+ نظر

برای ثبت نظر ابتدا ورود کنید.

0 نظر

    اولین نفر باش که نظر ثبت میکنی :) یعنی یه کامنت به ما نمیرسه 😁