0
0
Lập trình
TT

API GraphQL: Hướng dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao

Đăng vào 1 tuần trước

• 7 phút đọc

Chủ đề:

GraphQL API

API GraphQL: Hướng dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao

GraphQL là một ngôn ngữ truy vấn và một runtime để thực hiện các truy vấn dữ liệu API, được phát triển bởi Facebook vào năm 2012 và chính thức phát hành mã nguồn mở vào năm 2015. Bài viết này cung cấp hướng dẫn chi tiết về GraphQL, từ những khái niệm cơ bản đến những tính năng nâng cao, giúp bạn hiểu rõ và sử dụng GraphQL hiệu quả trong các dự án của mình.


1. Giới thiệu Về GraphQL

a. GraphQL Là Gì?

GraphQL là một ngôn ngữ truy vấn giúp khách hàng (client) yêu cầu chính xác dữ liệu cần thiết từ server, thay thế cho REST API truyền thống với nhiều ưu điểm vượt trội như:

  • Trả về chỉ dữ liệu cần thiết, không thừa thải hoặc thiếu sót.
  • Cho phép truy vấn từ nhiều nguồn khác nhau chỉ qua một yêu cầu duy nhất.
  • Hỗ trợ cấu trúc dữ liệu phân cấp (nested)

b. Cấu trúc Cơ Bản của GraphQL

GraphQL bao gồm ba phần chính:

  1. Schema: Định nghĩa các loại dữ liệu (types) và truy vấn (query/mutation) có sẵn.
  2. Resolvers: Logic xử lý các truy vấn và trả về dữ liệu.
  3. Runtime: Môi trường thực thi các truy vấn GraphQL.

2. Các Thành Phần Chính Trong GraphQL

a. Schema

Schema là trung tâm của GraphQL API, mô tả:

  • Query: Dùng để lấy dữ liệu.
  • Mutation: Thực hiện các thay đổi dữ liệu hoặc cập nhật trạng thái.
  • Subscription: Theo dõi và nhận thông báo theo thời gian thực khi có sự thay đổi.

Ví dụ về schema cơ bản:

graphql Copy
  type Todo {
    id: ID!
    title: String!
    completed: Boolean!
  }

  type Query {
    getTodos: [Todo]
  }

  type Mutation {
    addTodo(title: String!): Todo
  }

b. Query

Query được sử dụng để lấy dữ liệu từ API:

graphql Copy
query {
  getTodos {
    id
    title
    completed
  }
}

c. Mutation

Mutation dùng để thay đổi hay thêm dữ liệu:

graphql Copy
mutation {
  addTodo(title: "Học GraphQL") {
    id
    title
    completed
  }
}

d. Subscription

Subscription cho phép client nhận dữ liệu theo thời gian thực khi có sự thay đổi:

graphql Copy
subscription {
  onTodoAdded {
    id
    title
  }
}

e. Resolvers

Resolvers chứa logic xử lý và trả về dữ liệu:

javascript Copy
const resolvers = {
  Query: {
    getTodos: () => [...], // Lấy danh sách todos
  },
  Mutation: {
    addTodo: (_, { title }) => {
      const newTodo = { id: "1", title, completed: false };
      return newTodo;
    },
  },
};

3. Lợi Ích Khi Sử Dụng GraphQL

  1. Hiệu Quả Hơn So Với REST API:

    • Với REST, có thể cần nhiều endpoint để lấy dữ liệu khác nhau.
    • Với GraphQL, chỉ cần một endpoint duy nhất để yêu cầu dữ liệu.
  2. Dễ Dàng Mở Rộng và Bảo Trì:

    • Schema rõ ràng, bạn có thể dễ dàng thêm loại dữ liệu mới mà không làm ảnh hưởng đến client đã tồn tại.
  3. Tối Ưu Đối Với Các Ứng Dụng Phức Tạp:

    • Đặc biệt hiệu quả trong các hệ thống phân tán hoặc microservices.

4. Khái Niệm Nâng Cao Trong GraphQL

a. Fragments

Giúp tái sử dụng phần truy vấn trong GraphQL:

graphql Copy
fragment TodoFields on Todo {
  id
  title
  completed
}

query {
  getTodos {
    ...TodoFields
  }
}

b. Variables

Sử dụng biến để truyền các tham số động:

graphql Copy
query GetTodoById($id: ID!) {
  getTodoById(id: $id) {
    id
    title
    completed
  }
}

Dữ liệu biến:

json Copy
{
  "id": "1"
}

c. Directives

Thêm điều kiện vào truy vấn:

graphql Copy
query ($includeCompleted: Boolean!) {
  getTodos {
    id
    title
    completed @include(if: $includeCompleted)
  }
}

d. Batching và Caching

  • Batching: Nhóm nhiều truy vấn nhỏ thành một yêu cầu duy nhất giúp tối ưu hóa hiệu suất.
  • Caching: GraphQL không hỗ trợ caching mặc định, nhưng có thể tích hợp với các thư viện như Apollo Client để thực hiện điều này.

5. Cách Triển Khai API GraphQL

a. Các Thư Viện Phổ Biến

  • Node.js:
    • Apollo Server: Một framework phổ biến nhất cho GraphQL.
    • Express-GraphQL: Dễ dàng tích hợp với Express.js.
  • Ruby on Rails: GraphQL Ruby
  • Python: Graphene

b. Ví Dụ Với Apollo Server

  1. Cài Đặt:
    bash Copy
    npm install apollo-server graphql
  2. Tạo Server:
    javascript Copy
    const { ApolloServer, gql } = require("apollo-server");
    
    // Định nghĩa schema
    const typeDefs = gql`
      type Todo {
        id: ID!
        title: String!
        completed: Boolean!
      }
    
      type Query {
        getTodos: [Todo]
      }
    
      type Mutation {
        addTodo(title: String!): Todo
      }
    `;
    
    // Resolvers
    const resolvers = {
      Query: {
        getTodos: () => [{ id: "1", title: "Học GraphQL", completed: false }],
      },
      Mutation: {
        addTodo: (_, { title }) => ({ id: "2", title, completed: false }),
      },
    };
    
    // Tạo server
    const server = new ApolloServer({ typeDefs, resolvers });
    
    // Khởi chạy server
    server.listen().then(({ url }) => {
      console.log(`🚀 Server ready at ${url}`);
    });

c. Triển Khai GraphQL Với AWS AppSync

  • Sử dụng AWS AppSync cho phép tạo GraphQL API mà không cần quản lý backend, tiết kiệm thời gian và tài nguyên.

6. Công Cụ Hỗ Trợ GraphQL

a. GraphQL Playground/GraphiQL

  • Một môi trường trực quan cho phép hỗ trợ thử nghiệm các truy vấn GraphQL.

b. Apollo Client

  • Thư viện frontend mạnh mẽ cho các framework như React, Angular, Vue.js.

c. Relay

  • Framework frontend do Facebook phát triển, tối ưu hóa cho GraphQL.

d. Postman

  • Công cụ kiểm tra API dễ dàng có hỗ trợ cho GraphQL.

7. Những Lưu Ý Khi Sử Dụng GraphQL

  1. Bảo Mật:

    • Giới hạn depth limit để tránh các truy vấn phức tạp vượt mức.
    • Kiểm tra xác thực và phân quyền trong resolvers.
  2. Hiệu Năng:

    • Sử dụng DataLoader để giảm số lượng truy vấn đến database.
    • Tích hợp caching để cải thiện tốc độ truy cập.
  3. Kiểm Thử API:

    • Sử dụng công cụ như Jest, Mocha để kiểm thử resolvers và đảm bảo API hoạt động ổn định.

8. So Sánh Giữa GraphQL và REST API

Tiêu chí GraphQL REST API
Truy vấn dữ liệu Linh hoạt, chỉ yêu cầu dữ liệu cần Phải nhận toàn bộ dữ liệu
Endpoint Một endpoint duy nhất Nhiều endpoint
Thời gian thực Hỗ trợ Subscription Cần thiết lập riêng
Caching Cần tích hợp với thư viện khác Dễ dàng với HTTP headers

Kết Luận

Bài viết này đã cung cấp một cái nhìn tổng quan và chi tiết nhất về GraphQL, từ khái niệm cơ bản, ưu điểm, đến các khái niệm nâng cao, giúp các lập trình viên nhanh chóng nắm bắt và ứng dụng GraphQL trong thực tế. Việc hiểu rõ các thành phần và cách triển khai GraphQL sẽ giúp bạn tạo ra các API mạnh mẽ, linh hoạt và dễ bảo trì.

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