0
0
Lập trình
Admin Team
Admin Teamtechmely

Hướng dẫn phát triển GraphQL API bằng Golang và So sánh với REST API

Đăng vào 4 ngày trước

• 7 phút đọc

Phát triển GraphQL API bằng Golang

Trong bối cảnh phát triển ứng dụng web hiện nay, lựa chọn giữa GraphQL và REST API là một quyết định quan trọng đối với nhà phát triển. GraphQL, đặc biệt khi được triển khai với Golang, không chỉ mang lại tính linh hoạt mà còn giúp tối ưu hóa hiệu suất đáng kể. Bài viết này sẽ hướng dẫn bạn cách phát triển một GraphQL API đơn giản với Golang và so sánh những ưu điểm và nhược điểm giữa GraphQL và REST API.

Bước 1: Cài đặt các thư viện cần thiết

Trước hết, bạn cần cài đặt các thư viện để phát triển GraphQL API trong Golang. Hãy sử dụng công cụ go mod để quản lý các dependencies.

bash Copy
go mod init graphql-api
go get github.com/graphql-go/graphql
go get github.com/graphql-go/handler

Bước 2: Định nghĩa Schema

Schema trong GraphQL là phần rất quan trọng, nơi kết hợp các truy vấn và kiểu dữ liệu lại với nhau. Trong ví dụ này, chúng ta định nghĩa rằng queryType là root query của schema.

go Copy
var schema, _ = graphql.NewSchema(
    graphql.SchemaConfig{
        Query: queryType,
    },
)

Bước 3: Tạo GraphQL Handler

Handler đóng vai trò xử lý các yêu cầu HTTP và chuyển chúng đến GraphQL server. Sử dụng gói handler từ graphql-go để tạo một handler cho GraphQL.

go Copy
func graphqlHandler(schema *graphql.Schema) http.HandlerFunc {
    h := handler.New(&handler.Config{
        Schema:   schema,
        Pretty:   true,
        GraphiQL: true, // Bật GraphiQL
    })

    return func(w http.ResponseWriter, r *http.Request) {
        log.Println("Received request:", r.Method, r.URL.Path)
        h.ServeHTTP(w, r)
    }
}

Bước 4: Định nghĩa các truy vấn (Queries)

Trong GraphQL, bạn cần định nghĩa các kiểu dữ liệu mà API của bạn sẽ sử dụng. Chúng ta sẽ định nghĩa một kiểu User và chèn dữ liệu mẫu:

go Copy
var userType = graphql.NewObject(
    graphql.ObjectConfig{
        Name: "User",
        Fields: graphql.Fields{
            "id": &graphql.Field{
                Type: graphql.ID,
            },
            "name": &graphql.Field{
                Type: graphql.String,
            },
            "email": &graphql.Field{
                Type: graphql.String,
            },
        },
    },
)

// Dữ liệu mẫu
var users = []map[string]interface{}{
	{"id": "1", "name": "Nguyen Van A", "email": "nguyen.van.a@example.com"},
	{"id": "2", "name": "Nguyen Van B", "email": "nguyen.van.b@example.com"},
}

Các truy vấn trong GraphQL được định nghĩa thông qua việc tạo ra một đối tượng Query để truy vấn tới danh sách người dùng.

go Copy
var queryType = graphql.NewObject(
    graphql.ObjectConfig{
        Name: "Query",
        Fields: graphql.Fields{
            "hello": &graphql.Field{
                Type: graphql.String,
                Resolve: func(p graphql.ResolveParams) (interface{}, error) {
                    return "world", nil
                },
            },
            "users": &graphql.Field{
                Type: graphql.NewList(userType),
                Resolve: func(p graphql.ResolveParams) (interface{}, error) {
                    return users, nil
                },
            },
        },
    },
)

Bước 5: Khởi động server

Cuối cùng, hãy khởi động một HTTP server và gán handler cho endpoint /graphql.

go Copy
func main() {
    http.HandleFunc("/graphql", graphqlHandler(&schema))

    log.Println("Server is running on port 8030")
    log.Fatal(http.ListenAndServe(":8030", nil))
}

Xem thành quả

Sau khi khởi động lại server, bạn có thể truy cập vào http://localhost:8030/graphql qua trình duyệt. Giao diện GraphiQL sẽ xuất hiện, cho phép bạn thực hiện các truy vấn GraphQL.

Hãy thử truy vấn sau trong giao diện GraphiQL:

graphql Copy
{
  hello
  users {
    id
    name
    email
  }
}

Kết quả trả về sẽ giống như sau:

json Copy
{
  "data": {
    "hello": "world",
    "users": [
      {
        "email": "nguyen.van.a@example.com",
        "id": "1",
        "name": "Nguyen Van A"
      },
      {
        "email": "nguyen.van.b@example.com",
        "id": "2",
        "name": "Nguyen Van B"
      }
    ]
  }
}

Tóm tắt từng bước

  1. Cài đặt thư viện cần thiết: Sử dụng go mod để quản lý dependencies.
  2. Định nghĩa schema: Kết hợp các truy vấn và kiểu dữ liệu.
  3. Tạo handler: Xử lý các yêu cầu HTTP và chuyển đến GraphQL server.
  4. Định nghĩa các truy vấn: Tạo các truy vấn dữ liệu và định nghĩa kiểu dữ liệu.
  5. Khởi động server: Khởi động server HTTP với handler đã gán.

Với các bước trên, bạn đã phát triển thành công một GraphQL API cơ bản bằng Golang. Bạn có thể mở rộng với các kiểu dữ liệu, truy vấn, và thêm tính năng mutatation sau này.

So sánh REST API và GraphQL trong phát triển ứng dụng Golang

Khi lựa chọn giữa REST API và GraphQL trong phát triển ứng dụng, mỗi phương pháp có những ưu điểm và nhược điểm riêng. Dưới đây là so sánh chi tiết giữa hai cách tiếp cận này:

REST API

Ưu điểm:

  • Đơn giản và phổ biến: REST API dễ hiểu, sử dụng các phương thức HTTP tiêu chuẩn như GET, POST, PUT, DELETE.
  • Quản lý rõ ràng: Có các endpoint rõ ràng cho từng tài nguyên, dễ dàng cho việc bảo trì.
  • Hỗ trợ công cụ phong phú: Nhiều công cụ và thư viện có sẵn để phát triển và kiểm thử.

Nhược điểm:

  • Over-fetching và Under-fetching: Có thể gặp vấn đề khi lấy quá nhiều hoặc quá ít dữ liệu, dẫn đến việc gây tốn tài nguyên.
  • Khó khăn trong mở rộng: Khi ứng dụng phát triển, việc thêm hoặc thay đổi endpoint có thể trở nên phức tạp.
  • Thiếu linh hoạt: Clinet không thể tùy chỉnh dữ liệu trả về, dẫn đến việc phải tạo nhiều endpoint cho các mục đích khác nhau.

GraphQL

Ưu điểm:

  • Linh hoạt: Client có thể yêu cầu chính xác dữ liệu cần thiết, giảm thiểu vấn đề over-fetching và under-fetching.
  • Một endpoint duy nhất: Tất cả các truy vấn và thao tác thực hiện qua một endpoint, giúp đơn giản hóa quản lý API.
  • Tự tài liệu hóa: Schema tạo tự động tài liệu cho API, dễ dàng sử dụng hơn.
  • Hiệu suất tốt hơn: Chỉ lấy dữ liệu cần thiết, cải thiện hiệu suất ứng dụng.

Nhược điểm:

  • Phức tạp hơn: Thiết lập và hiểu GraphQL có thể phức tạp hơn, đặc biệt cho những người mới vào nghề.
  • Cần thêm công cụ: Để làm việc hiệu quả, cần sử dụng thêm một số công cụ và thư viện.
  • Vấn đề bảo mật: Việc kiểm soát quyền truy cập có thể trở nên phức tạp hơn, đặc biệt khi dữ liệu và trường dữ liệu cần bảo mật.

Kết luận

  • REST API: Phù hợp cho các ứng dụng đơn giản và dễ học. Nhưng có thể gặp vấn đề với việc fetch dữ liệu không hiệu quả.
  • GraphQL: Phù hợp cho các ứng dụng phức tạp với yêu cầu linh hoạt hơn về dữ liệu. Cung cấp hiệu suất tốt và tự động tài liệu hóa, nhưng có thể phức tạp hơn trong việc thiết lập và bảo mật.

Lựa chọn giữa REST API và GraphQL hoàn toàn phụ thuộc vào yêu cầu cụ thể của dự án và kinh nghiệm của đội ngũ phát triển.
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào